【发布时间】:2013-07-02 22:04:06
【问题描述】:
我最近发现 JavaScript 有一个新的扩展。这为toLocaleString、toLocaleDateString 和toLocaleTimeString 函数中的Date 对象添加了几个功能。 Reference here.
我对支持IANA/Olson time zones 的timeZone 选项特别感兴趣,例如America/New_York 或Europe/London。 目前仅在 Google Chrome 中支持。
之前的建议是,要在 JavaScript 中使用除 UTC 或您自己的本地时区以外的任何其他时区,必须use a library。但现在,这似乎开始直接整合到浏览器中。所以现在你可以这样做了:
new Date().toLocaleString("en-US", {timeZone: "America/New_York"})
// output: "7/4/2013 5:15:45 PM"
或者:
new Date().toLocaleString("en-NZ", {timeZone: "Pacific/Chatham",
timeZoneName: "long"})
// output: "7/5/2013 9:59:52 AM GMT+12:45"
或者:
new Date().toLocaleString("en-GB", {timeZone: "Europe/London",
timeZoneName: "short"})
// output: "4/7/2013 22:18:57 United Kingdom Time"
// (strange time zone name, but ok)
这非常很酷,但我有几个问题:
- 这是新标准的一部分吗?也许埋在 ECMAScript 6 的某个地方?还是它只是 Chrome 的自定义功能?
- 为什么只有谷歌浏览器?它在其他任何地方都支持吗?是否有计划在其他任何地方支持它?
- 我检查了使用 Chrome 的 JavaScript 运行时的 node.js,但它在那里不起作用。为什么不呢?
- 是否可以通过我列出的函数以外的任何其他方式访问时区数据?如果仅在格式化字符串时可用,那么根据结果进行任何计算可能会很困难。
-
这专注于输出,但我将如何将其用于输入?有没有办法将构造函数中的时区传递给
Date对象?我尝试了以下方法:// parsing it with a date and time new Date("2013-01-01 12:34:56 America/New_York") // passing it as a named option new Date(2013,0,1,12,34,56,{timeZone:"America/New_York"})都没有用。我在规格中找不到任何东西,所以我认为这不存在(目前),但如果我错了,请告诉我。
-
this post 中描述的问题是由 ECMAScript 5 规范中的缺陷造成的,即使 TZDB 中有正确的数据,它仍然会影响输出。新旧实现如何共存?人们会认为这将是所有旧方式或所有新方式。例如,我的计算机时区设置为美国东部时间:
new Date(2004,10,7,0,0).toLocaleString("en-US",{timeZone:"America/New_York"})返回
"11/6/2004 11:00:00 PM"。它应该返回午夜,因为我从午夜开始并且我的本地时区与输出时区匹配。但由于 ES5 问题,它将提供的输入日期置于错误的 UTC 点。 我可以期待随着 IANA 发布对 TZDB 的更新,Google 会推送包含这些更改的 Chrome 更新吗?
【问题讨论】:
标签: javascript google-chrome internationalization timezone ecmascript-intl