【问题标题】:Javascript getTime() delivers confusing resultsJavascript getTime() 提供令人困惑的结果
【发布时间】:2021-12-30 19:59:11
【问题描述】:

我搜索了很多,但找不到对此的解释,在我看来,getTime() 的行为令人困惑。文档指出:

getTime() 始终使用 UTC 表示时间。例如,一个 一个时区的客户端浏览器,getTime() 将与客户端相同 任何其他时区的浏览器。

根据这个说法,我的理解是,例如

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 提前一小时。

【问题讨论】:

  • new Date (Date.UTC(2021,8,1)) -> UTC, new Date (2021,8,1) -> 本地 - 所有在documentation over at MDN中提到
  • 这是合乎逻辑的,因为您的第二个日期是 utc+1,所以到 1970 年的 utc 秒数是 1 小时减去日期
  • .getTime() 的返回值将始终为“UTC”(以秒为单位的差异...)。但是传递给 Date 构造函数的日期会受到不同的处理,因为一个是 UTC,一个是你的 lcoal 时间。
  • 我猜这种混淆主要是由于文档中的句子有点多余。它没有比声明10 - 7 在每个浏览器中评估为3 更深入。 .getTime() 本质上提供了减法的结果,它给出了日期 A 和日期 B 之间经过的毫秒数。日期 A 是 1970 年 1 月 1 日 UTC 的午夜。因此,假设日期 B 跨时区相同,则跨时区差异也相同,因此 getTime() 的结果跨时区相同。
  • new Date (2021,8,1) 但是会根据脚本运行的时区产生不同的时间点(因为它使用本地时间),因此与固定 UTC 时间点的差异也会因浏览器而异。在 GMT+0 和 GMT+1 中运行 new Date (2021,8,1) 会给出两个相隔一小时的日期,因此 getTime() 将给出相隔 3600000 毫秒的两个数字。然而,这与文档中的句子并不矛盾,因为两个时区的输入日期不同。

标签: javascript date utc epoch gettime


【解决方案1】:

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

所有根本不明白为什么会出现问题的人,很可能都是从普通网络浏览器用户的角度来看待这个问题的。在这种情况下,如果 UTC+1 的用户在假设 2021 年 9 月 1 日 07:00:00 打开一个调用 getTime() 的网站,则会导致:

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)。这让我感到困惑。也许这种解释也对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多