【问题标题】:JavaScript Date() inconsistence with Safari's and non-Safari implementationJavaScript Date() 与 Safari 和非 Safari 实现不一致
【发布时间】:2020-07-01 19:14:16
【问题描述】:

我有以下简单的 JS 代码:

document.getElementById ("testLastTime").innerHTML=new Date ('2020-07-01T11:59:45').toLocaleString()

在 Chrome、Edge、Firefox(所有在 Windows 上)显示正确的日期:

2020 年 7 月 1 日上午 11:59:45

但在 iOS 设备上,此日期被解释为 UTC 并显示以下日期(我在 PST):

2020 年 7 月 1 日凌晨 4:59:45

此代码是较大项目的一部分,其中本地时间(不含 TZ)的日期时间 ISO 格式字符串由服务器(Python 烧瓶)发送到客户端。

如何让所有设备上的 JS 显示相同的日期?

【问题讨论】:

  • 可能我只能认为不一致可能归结为 toLocaleString() 方法而不是浏览器。尝试 toString() 方法或 toDatestring() 但格式可能不同,使用 toDatestring() 我不认为你会得到时间部分。如果您要进行大量日期操作,那么我建议您查看时刻库
  • @Chief - 使用 toString() 时的结果相同。有趣的是,在 iOS 上,时间显示为正确的 TZ: GMT-0700(PDT) 作为 Windows,但有 7 小时的偏移
  • Safari 的解析器有问题。不要使用内置解析器,请参阅Why does Date.parse give incorrect results?
  • 只要在最后加上一个明确的时区,比如new Date(…+'Z')
  • @Bergi 我想我试过了。我不认为它有帮助。不管怎样,那一刻成功了

标签: javascript date flask


【解决方案1】:

正如 Chief 所建议的那样,使用 moment libary 解决了这个问题。由于我使用的是 ChartJS,所以已经加载了时刻。

所以虽然这有效:

document.getElementById ("testLastTime").innerHTML=new moment ('2020-07-01T11:59:45').format ('M/D/YYYY, h:mm:ss A');

我仍然很想知道为什么 JS iOS 结果是 UTC,而 PC 结果不是在使用 Date 时

【讨论】:

  • 不带时区的格式'2020-07-01T11:59:45'应被视为本地(EMCA-262 §20.3.1.15: "当时区偏移不存在时,仅日期形式被解释为 UTC 时间,而日期时间形式被解释为本地时间。"),但 Safari 的解析器有问题并将其视为 UTC。
  • @RobG - 是的,完全同意,这就是理解规范的方式。因此我的原始帖子。如果不查看 JS 源代码,它确实似乎知道这个错误并解决它?
  • 不,不是,但确实避免了。如果您不将解析格式传递给 moment.js 并且字符串是 ECMA-262 支持的格式,则 moment 使用自己的解析器,因此可以避免该问题。如果字符串不是 ECMA-262 识别的 ISO 格式之一,它将回退到内置解析器。您应该始终提供解析格式。
猜你喜欢
  • 1970-01-01
  • 2017-01-22
  • 2011-07-09
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多