我进行了很多搜索,但找不到对此的解释,我认为 getTime()
的行为令人困惑。文档指出:
getTime() always uses UTC for time representation. For example, a client browser in one timezone, getTime() will be the same as a client browser in any other timezone.
根据这个说法,我的理解是,例如
1. new Date (Date.UTC(2021,8,1)).getTime() // UTC Date 1.Sep.2021 00:00:00
2. new Date (2021,8,1).getTime() // Local (UTC+1) Date 1.Sep.2021 00:00:00
应该提供相同的毫秒数。但我得到的结果是:
1. 1630454400000
2. 1630447200000 // 1 hour (3600000 ms) missing
问题 A:从 1970 年 1 月 1 日起,实际上已经过去了相同的时间。根据文档,为什么结果不相等(夏令时也很重要!)?
问题 B:如果行为正确,为什么会少一小时?不是应该还有一小时吗?逻辑上UTC+1 提前一小时。
最佳答案
好的,我找到了造成困惑的原因。感谢你的帮助!尤其是 Chris G,他为我指明了正确的方向。这就是我的大脑被搞砸的原因;-)
所有根本不明白为什么会出现问题的人很可能是从普通网络浏览器用户的 Angular 来看这个问题的。在这种情况下,如果 UTC+1 中的用户打开一个调用 getTime()
的网站。假设 2021 年 9 月 1 日 07:00:00,结果如下:
now Date ( 2021, 8, 1, 7, 0, 0 ).getTime()
现在,如果第二个用户在 UTC+0 的同一时刻执行相同的操作,则会导致:
now Date ( 2021, 8, 1, 6, 0, 0 ).getTime()
那么我们当然会得到相同的结果!我的问题是我假设调用:
now Date ( 2021, 8, 1, 7, 0, 0 ).getTime()
不同时区应该给出相同的结果。事实并非如此!现在你可能会问为什么有人需要这个。原因很简单。我正在 Electron 中开发一个小甘特图工具,我需要比较/减去日期。当然,我不需要上述内容为真(提供相同的值),但我遇到了这个问题,因为在通过使用 getTime()
将日期转换为毫秒来减去日期时,我没有得到可整除的毫秒数。 。我期待着根据文档,它说 getTime()
会在每个时区给出相同的值,得到一个不受时区或夏令时影响的绝对值,进行计算。因此我期望例如:
now Date(2021,4,1,0,0,0).getTime() - now Date(2021,11,1,0,0,0).getTime()
应给出毫秒数,该毫秒数应能被 86400000(一天)整除。但事实并非如此。原因是由于夏令时,第二个日期晚了1小时!
结论
查看同一时间点(例如 UTC+0)时,文档中的陈述是正确的 06:00 和 UTC+1 07:00),但在查看相同小时数时则不然(例如 UTC+0 07:00 和 UTC+1 07:00)。这就是让我困惑的地方。也许这个解释对其他人也有帮助。
关于Javascript getTime() 提供令人困惑的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70530068/