【问题标题】:JavaScript date-only format guaranteed to be interpreted as local time in modern browsersJavaScript 仅日期格式保证在现代浏览器中被解释为本地时间
【发布时间】:2016-03-21 18:14:10
【问题描述】:

我正在寻找一种日期格式(只有年、月和日,没有时间组件),当传递给JavaScript 中的 Date() 构造函数。

(3-letter English month abbreviation) (2-digit date) (4-digit year) 格式似乎有效。当我在我的英语系统、Chrome 中使用 new Date('Apr 01 2015') 并且我的机器位于东部时区时,我会返回 Wed Apr 01 2015 00:00:00 GMT-0400 (Eastern Daylight Time),这正是我想要的。

但是,我不确定这种(3-letter English month abbreviation) (2-digit date) (4-digit year) 格式是否保证以相同的方式解释,而不管浏览器和浏览器/操作系统区域设置/语言如何。

这种格式在不同(相当现代的)浏览器和语言环境中的工作方式是否相同?如果不是,那么还有其他格式可以使用吗?

请注意,ISO-8601 没有回答这个问题。 ISO-8601 仅日期字符串被解释为 UTC,而不是本地时间,因此 new Date('2015-04-01') 被解释为 Tue Mar 31 2015 20:00:00 GMT-0400 (Eastern Daylight Time),即 4 月 1 日变成了 3 月 31 日,这不是我想要的。

【问题讨论】:

  • "ISO-8601 纯日期字符串被解释为 UTC"。那是在 ES5 中,ECMAScript 2015 将其更改为“本地”。

标签: javascript date datetime cross-browser timezone


【解决方案1】:

我正在寻找一种日期格式(只有年、月和日,没有时间组件),当传递给 JavaScript 中的 Date() 构造函数时,它可以保证在所有合理的现代浏览器中被解释为本地时间.

没有。在实践中,有许多格式可以被所有正在使用的浏览器可靠地解析,但是 ECMA-262 并不要求 ECMAScript 实现支持这些格式。

在 ES5 和 ECMAScript 2015 中指定了一种格式,即 ISO 8601 版本,但是没有时区的日期在 ES5 中被视为 UTC,在 ECMAScript 2015 中被视为“本地”。

但是这被实施者视为“破坏网络”,因此虽然一些浏览器实施了一段时间,但它们现在已恢复为 ES5 行为并将缺少的时区视为 UTC。 p>

格式上的微小变化(例如将分隔符从“-”更改为“/”会导致恢复为依赖于实现的行为,并可能导致日期被视为 UTC 或本地日期(尽管大多数似乎将 2015/12/ 17 作为本地)。

因此,如果您想要保证,则没有。但是,如果您准备编写 2 行函数,则可以根据您喜欢的任何时区可靠地解析类似 ISO 8601 的字符串。如果您希望将其视为本地(即设置为 00:00:00 并根据系统设置进行偏移),则:

function parseISOLike(s) {
    var b = s.split(/\D/);
    return new Date(b[0], b[1]-1, b[2])
}

document.write(parseISOLike('2015-12-17'));

将完成这项工作(不检查有效值)并允许分隔符为任何非数字,因此 2015/12/17、2015-12-17 和 2015.12.17 都将被正确解析。

编辑

感谢Matt Johnson的输入,以上部分内容已被编辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2019-07-28
    • 2019-11-13
    • 2015-11-20
    相关资源
    最近更新 更多