Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

时间系列一:认识js世界的日期与时间 #72

Open
wuyunqiang opened this issue Aug 20, 2024 · 0 comments
Open

时间系列一:认识js世界的日期与时间 #72

wuyunqiang opened this issue Aug 20, 2024 · 0 comments

Comments

@wuyunqiang
Copy link
Owner

先有问题再有答案

  1. GMT是什么?
  2. UTC是什么?
  3. 时区是什么?
  4. 时间与时区有什么关系?
  5. 日期的表示形式为什么要是YYYY-MM-DD HH:MM:SS 这个是怎么来的?
  6. 如何理解时间戳?
  7. 从同一个timestamp解析到的时间是唯一的嘛?
  8. 关于date对象 我们应该了解哪些知识
  9. 常用的时间库有哪些

背景

GMT (Greenwich Mean Time):

GMT是以前世界时间的标准,其定义是以太阳经过位于英国伦敦郊区的皇家格林威治天文台的时间为中午12点。1884年,在美国华盛顿召开的国际子午线会议将格林威治子午线设定为本初子午线,并将GMT作为世界时间标准。

GMT因为是根据地球的转动来计算时间的,而地球的自转受潮汐、地震、风速等因素的影响自转速度是不均衡的,而且自转速度也会越来越慢,所以GMT不够精确,就不再使用了。

时区 (Timezone)

World_Time_Zones_Map.png
1884年的国际子午线会议上,根据地球大约每24小时自转一圈。为了方便时间的划分和计算,人们将地球划分为24个时区,每个时区覆盖15度经度,时间跨度正好是1小时。规定英国格林尼治天文台旧址为零时区、东1-12区,西1-12区。

然而在实际中常常以国家内部行政分界线为时区界线,比如中国的地理区划,西至75°E,东至135°E,横跨多个时区,实际上我们国家法定时区为东八区标准时,也就是北京时间.

所以同样显示早上6点,在中国的最西边实际上是凌晨3点。因为显示的时间是东8区的时间,实际处于东5区。差了3个小时的时差。

UTC (Coordinated Universal Time)

UTC是现在全球通用的时间标准,1960年国际无线电咨询委员会规范统一了UTC的概念,并在1961年投入实际使用。UTC由原子时(TAI)和世界时(UT)综合精算而成,比GMT更精准,适应现代社会的精确计时。UTC在1967年被正式采纳为“Coordinated Universal Time”这个名称。

GMT VS UTC

GMT曾是世界的官方时间标准,但在UTC被引入后,GMT不再作为一个时间标准使用。然而,在不需要精确到秒的情况下,GMT和UTC可以视为等同,UTC是GMT的一个现代化、更精确的版本. 我们通常认为GMT = UTC + 0(时区)

时区&时间

单独说时间是没有意义的 要放在某一个时区下时间才是有意义的。 例如我和伦敦的同学约定2024.07.13 12:00:00 约定会议。我这里默认的北京时间 他看到的是伦敦时间。差了8个小时,所以我们在国际上参与业务交流时一定要注意是以那个时区为准。

时间戳 (timestamp)

Timestamp即时间戳,它表示某一时间的唯一标识。在Unix和许多Unix-like系统中,时间戳通常被定义为自1970年1月1日(UTC时区)午夜起的秒数(不包含闰秒)。这样的时间戳通常被称为Unix Timestamp

使用1970年1月1日作为起点的主要原因是Unix操作系统诞生在1970年之后。当时Unix系统的开发者需要选择一个“起点”来计算时间,作为Unix系统时间“纪元”。然后他们选择了尽可能地早---也就是Unix系统出现前的1970年1月1日。

时间戳&时间

世界上同一时刻的时间戳是相同的,因为时间戳表示的是从1970年1月1日格林尼治时间午夜开始到现在所经过的时间长度,这个长度是不会因为你在地球的哪里而发生变化的。

但是同一个时间戳转换为具体时间时可能会因时区不同而显示不同的时间,这是因为时区的工作方式。世界被划分为24个时区,每个时区都有其本地时间,这些时区的本地时间与世界协调时间(UTC)存在固定的时间差。当我们将时间戳转换为具体时间时,是将时间戳加上1970年1月1日午夜的时间,得到的时间是UTC时间,也就是0时区的时间。

如果我们要得到其他时区的时间,就需要根据具体的时区与0时区的时间差来调整。因此,同一个时间戳在不同的时区转换出来的时间就会不同

时间的ISO标准

ISO日期是根据国际标准化组织(ISO)制定的ISO 8601日期和时间表示法来表示的日期。ISO 8601的目标是消除在全世界范围内对日期和时间的表示和交流的混乱,并提供了一个井然有序的系统。

ISO 8601表示法规定日期时间为YYYY-MM-DDTHH:MM:SSZ的格式

YYYY:表示4位数的年份

MM:2位数的月份

DD:2位数的日期

时间:HH:MM:SS

其中T是日期和时间的分隔符,Z表示该时间为UTC时间。

终于明白为啥格式化日期的时候习惯用YYYY-MM-DD和HH:MM:SS这种标识法了😂...

所以iso标准中 "2024-07-15T14:48:00.000+08:00" 这个表示:中国北京时间 2024年7月15日 14点48分0秒。

js世界的时间-Date对象

截屏2024-07-11 下午8.39.56.png

如何理解Date对象

在JavaScript中,Date对象用于处理日期和时间。

通过Date对象,你可以创建、解析和格式化日期和时间,也可以进行日期和时间的计算。

  • 创建日期 : var date = new Date(); 这将创建一个表示当前日期和时间的Date对象。
  • 解析日期: var date = new Date("2024-03-11"); 这将创建一个表示2020年3月11日的Date对象。 但这种方式是不建议的,不同的JavaScript引擎可能对日期时间字符串的解析存在一定的差异。尽管大部分现代浏览器都能很好地解析符合ISO 8601标准的日期时间字符串(比如"2020-03-11"),但仍有可能在一些较旧的浏览器或特定的环境中解析出错。另外,对于"月-日-年"和"日-月-年"这两种常见的非ISO标准的日期格式,不同的JavaScript引擎甚至可能有完全不同的解析结果。因此,如果你不能确定你的代码会在什么样的环境中运行,或者你需要解析的日期时间字符串的格式可能有所不同,那么使用字符串来创建Date对象可能是存在风险的。使用时间戳来创建Date对象则更为可靠。因为时间戳是一种数字,不存在解析的问题
  • 格式化日期:Date对象有很多方法可以格式化日期,
    截屏2024-07-12 上午11.31.58.png
    不过实际业务我们一般会自己写一个格式化的方法
  • 日期和时间的计算:你可以通过Date对象的方法比如 getFullYear(), getMonth(), getDate(), getHours(), getMinutes(), getSeconds() 等得到年、月、日、时、分、秒,然后进行计算。

日期的本质

计算机是一个数字的世界,date对象本质上保存的是距离1970年1月1日 0时0分0秒 utc时区的差值也就是时间戳,只是在使用的时候通过和当前的时区计算得出本地的具体日期时间。所以在传输,存储,实例化日期的时候建议使用timestamp的方式。

date获取时区

截屏2024-07-12 上午11.18.24.png
通过getTimezoneOffset UTC时区是0 我们比它快了8个小时 所以是480分钟。

时间处理库

  1. momentjs
  2. dayjs

参考文章

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant