【问题标题】:Difference between new Date(...).getTime() and Date.UTC(...)new Date(...).getTime() 和 Date.UTC(...) 之间的区别
【发布时间】:2020-03-12 01:27:34
【问题描述】:

谁能解释一下为什么这两个命令会返回不同的结果:

> new Date(2019, 0, 1).getTime()
> 1546293600000

> Date.UTC(2019, 0, 1)
> 1546300800000

根据getTime方法的MDN文档:

getTime() 方法返回自 Unix 纪元以来的毫秒数*。

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

和 Date.UTC 方法:

Date.UTC() 方法接受类似于 Date 构造函数的参数,但将它们视为 UTC。它返回自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数。

它们应该是一样的吗?

我只是怀疑如何计算 1924 年与今天之间的差异。因为如果我们只是在 1924 年的时间戳上加上一年(以毫秒为单位),它将会完全搞砸。有一个我完全无法理解的行为示例:

> new Date( new Date(1924, 0, 1).getTime() + 366 * 24 * 60 * 60 * 1000 )
> Wed Dec 31 1924 23:57:56 GMT+0200 (Eastern European Standard Time)

【问题讨论】:

  • 我的建议是不要用 javascript 日期对象挠头,而是开始使用 momentjs。
  • new Date( Date.UTC(1924, 0, 1) + 366 * 24 * 60 * 60 * 1000 ).toUTCString()

标签: javascript


【解决方案1】:

new Date(2019, 0, 1) 创建一个 Date 对象,表示 2019 年 1 月 1 日的开始时间在您的语言环境指定的时区。当转换为 UTC 时,它将与 UTC 的 1 月 1 日开始时间不同。

运行你的第二个 sn-p 来增加一年对我来说是正确的结果。您在什么浏览器或上下文中运行?

【讨论】:

  • 节点 12 和 Chrome。结果相同
  • 奇怪,在我的 chrome 版本上正常工作。如果您使用的是节点,请跳过疯狂的 Date 对象并使用 moment
  • 是的,也许,只是对正在发生的事情感兴趣。
  • 感谢您的回答,我现在了解 UTC。
【解决方案2】:

new Date(2019, 0, 1) 根据您的时区创建一个对象,而Date.UTC(2019, 0, 1) 为您提供 UTC 时间戳。

我在 CE(S)T,所以会有 1 小时 3600000 毫秒的差异:

new Date(2019, 0, 1).getTime() // time in CEST
> 1546297200000
Date.UTC(2019, 0, 1) // time in UTC
> 1546300800000
new Date(2019, 0, 1).getTime() - Date.UTC(2019, 0, 1) // Subtract my time from UTC (I'm ahead, so the difference will be negative)
> -3600000

【讨论】:

  • 谢谢!现在对我有意义
猜你喜欢
  • 1970-01-01
  • 2017-02-14
  • 2019-11-12
  • 2015-05-25
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 2010-09-26
相关资源
最近更新 更多