为啥 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.parse
或new 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 Date
或 Date.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) 在具有完全相同输入的不同设备上返回两个不同的日期? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
new Date("2017-1-19")在IE8下获取日期返回NAN
为啥 (new Date() == new Date()) 为假,但 (Date() == Date()) 为真? [复制]