为啥 new Date(dateString) 在具有完全相同输入的不同设备上返回两个不同的日期? [复制]

Posted

技术标签:

【中文标题】为啥 new Date(dateString) 在具有完全相同输入的不同设备上返回两个不同的日期? [复制]【英文标题】:Why does new Date(dateString) return two different dates on different devices with exactly the same input? [duplicate]为什么 new Date(dateString) 在具有完全相同输入的不同设备上返回两个不同的日期? [复制] 【发布时间】:2017-05-11 13:45:21 【问题描述】:

知道我的时区是 GMT+2,请考虑以下代码:

在自拍 4G 手机上跑步:

myDate = "2017-05-12T09:00:00";
dateFoo = new Date(myDate); //  Fri May 12 2017 11:00:00 GMT+0200 (CEST)

在 Galaxy S7 上运行:

myDate = "2017-05-12T09:00:00";
dateFoo = new Date(myDate); //  Fri May 12 2017 09:00:00 GMT+0200 (CEST)

为什么输出不一致,我该如何解决?

我的问题与其他类似问题(例如Why does Date.parse give incorrect results?)不同,因为在我的情况下,我使用的是完全相同的字符串,而且不同的是设备。

【问题讨论】:

另一个可能的骗局:***.com/q/6427204/5743988 我不认为这是 @4castle 错误的副本——这个问题中的日期看起来像格式正确的 ISO 日期,尽管没有明确的时区。 @Pointy 输入可能格式正确,但 Date 解析器的实现不是标准化的,所以这足以导致任何不一致。 我的意思是,永远不要使用Date.parsenew Date 来解析不是来自Date.toString() 的日期字符串,因为标准是不确定的,而且它没有无论您使用什么浏览器或什么设备,首先不应期望它是一致的。 @Pointy—ECMA-262 不需要时区,因此“2017-05-12T09:00:00”与标准一致,应视为“本地”。虽然依赖内置的日期解析器是一个糟糕的主意。 【参考方案1】:

您的日期差异是因为时区。 您可以尝试将日期转换为 UTC 日期以获得完美的结果。

    myDate = "2017-05-12T09:00:00";
    dateFoo = new Date(myDate).toUTCString();

【讨论】:

"2017-05-12T09:00:00" 不是 UTC。 是的,我知道这不是 UTC,我只会将此“2017-05-12T09:00:00”字符串转换为 UTC 格式【参考方案2】:

最初的问题是,一台设备上的 Date.parse 将我的本地时间作为时区,而在另一台设备上则使用 UTC。

通过在我的初始 dateString 末尾附加一个 Z,我强制日期始终被视为 UTC,无论是什么设备,因此使用 Date.parse() 实现了一致的结果。

为了得到我当地时间的日期,我使用了这个问题的答案:https://***.com/a/1486612/1875581。

【讨论】:

我不建议您将此作为永久解决方案。有人说 many times before 使用 new DateDate.parse 解析日期是不好的做法,因为在 ES6 之前的浏览器实现不一致。如果您想要一致的结果,建议您使用第 3 方日期解析库。 (如moment.js)。 谢谢,就我而言,设备种类繁多,所以我一定会看看 moment.js。 附加 Z 是个坏主意。 "2017-05-12T09:00:00" 应该被解析为本地,但附加一个 Z 会将其解析为 UTC。底线是永远不要使用内置解析器,使用函数或库。链接的答案(JSON Stringify changes time of date because of UTC)是错误的。 在我的例子中,添加 Z 允许跨不同设备的一致行为,因此允许我应用时区调整而不必担心设备是否会有不同的解析日期。

以上是关于为啥 new Date(dateString) 在具有完全相同输入的不同设备上返回两个不同的日期? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

JS中new Date该如何设置?

new Date("2017-1-19")在IE8下获取日期返回NAN

转:new Date()的浏览器兼容问题

为啥 (new Date() == new Date()) 为假,但 (Date() == Date()) 为真? [复制]

Javascript Date(dateString) 在特定服务器和浏览器上返回 NaN

JavaScript 的 new date() 和 date() 为啥输出不一样?