【问题标题】:Chrome 58.0.3029.110 version not converting date in correct local timezoneChrome 58.0.3029.110 版本未在正确的本地时区转换日期
【发布时间】:2017-05-22 14:18:57
【问题描述】:

Chrome 没有给出正确的日期转换结果:

日期:“2017-05-22T14:00:00”

在 chrome 控制台中执行此操作:

new Date("2017-05-22T14:00:00");

输出是:

Mon May 22 2017 14:00:00 GMT+0530 (IST)

这是错误的,因为我在 IST。它应该将输出作为

Mon May 22 2017 19:30:00 GMT+0530 (IST) 

Safari 给出了正确的结果。 Chrome 之前是正确的,但我认为最新的更新有问题。

发现在日期字符串中附加 Z 会导致正确的日期值。

new Date("2017-05-22T14:00:00Z");

【问题讨论】:

  • 使用字符串格式构造函数有什么技术原因吗? MDN 精彩地总结了这一点:由于浏览器的差异和不一致,强烈建议不要使用 Date 构造函数(和 Date.parse,它们是等效的)解析日期字符串
  • 从服务中以这种格式接收日期字符串“2017-05-22T14:00:00”,我无法修改服务。那么应该怎样才能得到正确的结果呢?
  • Why does Date.parse give incorrect results? 这不是一个错误,它是应该如何解析没有时区的 ISO 8601 字符串(但无论如何你都不应该使用内置解析器)。跨度>

标签: javascript google-chrome date timezone


【解决方案1】:

输入值被正确解释。 ECMAScript 2015 (ES6) 第 20.3.1.16 节指出:

如果不存在时区偏移,则日期时间被解释为本地时间

这也符合 ISO-8601 标准。

在以前版本的 ECMAScript 中,未提供偏移量时假定为 UTC。这违反了 ISO-8601,并且在各种环境中的实施不一致。

如果您希望将输入解释为 UTC,则应提供偏移量,+00:00Z 作为输入字符串的一部分。

然而,如果您谈论的是在登录到调试控制台时应该如何显示Date 对象,那么规范中没有定义。在某些环境中,您会看到date.toString() 的输出,它以非标准格式显示本地日期和时间,而在其他环境(例如FireFox)中,您将看到date.toISOString() 的输出,它显示ISO-8601 格式的 UTC 日期和时间。

没有关于显示的规范,所以任何一个都是有效的。如果您想查看特定的输出,请不要只记录 Date 对象,而是在返回字符串的对象上调用函数并将其记录下来。

【讨论】:

  • 那么这是否意味着它以前不正确,因为对于相同的 dateTime 字符串,即末尾没有“Z”,chrome 将其视为 UTC 并将其转换为 localTimeZone?我在 chrome 更新后看到了这个。
  • 这是否意味着 safari 做错了,因为 safari 将不带“Z”的 dateTime 视为 UTC,并将其转换为本地时区,就像 chrome 之前所做的那样。
  • 根据 ISO8601,没有偏移的值是本地时间。 ES5.1 及更低版本有这个错误,他们在 ES6 中更正了它。以前,有些浏览器将其视为当地时间,有些则将其视为 UTC。如今,所有浏览器都应将其视为本地时间。它是最新版本的 Safari 吗?如果是这样,他们就有一个错误。
  • 另请注意,没有偏移量的仅日期形式仍被解释为 UTC,即使它违反 ISO8601。这是经过深思熟虑的,因为所有先前的实现都以 YYYY-MM-DD 格式处理仅日期,就好像它是 UTC(即使 ISO8601 说的完全相反)。此外,我在my recent talk at JSConfEU 中(部分)介绍了这一点。
  • 你不能。 JS Date 对象不是这样工作的。无论它们是如何初始化的,它们都不保存任何时区信息。它们在内部表示自 unix 纪元以来的 ms,并且某些函数在调用时使用系统本地时区。您可以使用字符串或moment 对象(使用moment.js),但不能使用Date。此外,您在 cmets 中将问题链接到此处 - 最后一部分应该是它自己的单独问题。
猜你喜欢
  • 2016-04-07
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
  • 2014-01-28
  • 1970-01-01
相关资源
最近更新 更多