Javascript getTime() 提供了令人困惑的结果

Javascript getTime() delivers confusing results

我搜索了很多,但找不到对此的解释,在我看来 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:物理上自 1.1.1970 以来经过了相同的时间。根据文档,为什么结果不相等(夏令时也很重要!)?

问题B:如果行为正确,为什么少了一小时?不是应该还有一小时吗?逻辑上 UTC+1 提前一小时。

好的,我发现了造成混乱的原因。感谢你的帮助!特别是 Chris G,他为我指明了正确的方向。这就是我的大脑搞砸了 ;-)

所有根本不明白为什么会出现问题的人,很可能是从普通网络浏览器用户的角度来看这个问题的。在这种情况下,如果 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 中开发一个小甘特图工具,我需要 compare/subtract 日期。当然,我不需要以上内容为真(提供相同的值),但我遇到了这个问题,因为在通过 getTime() 将日期转换为 ms 来减去日期时,我没有得到可整除的毫秒数。我期待根据文档,它说 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)。这就是让我困惑的地方。也许这个解释对其他人也有帮助。