28

我最近发现 JavaScript 有一个新的扩展。这为,和函数 Date中的对象添加了几个特性。参考这里toLocaleStringtoLocaleDateStringtoLocaleTimeString

我对timeZone支持IANA/Olson time zone的选项特别感兴趣,例如America/New_Yorkor Europe/London这目前仅在 Google Chrome 中受支持

以前的建议是,要在 JavaScript 中使用除 UTC 或您自己的本地时区以外的任何其他时区,必须使用 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"})
    

    都没有奏效。我在规格中找不到任何东西,所以我认为这不存在(还),但如果我错了,请告诉我。

  • 这篇文章中描述的问题是由 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 更新吗?

4

2 回答 2

22

更新

这里有关于 API 的大量文章


这是新标准的一部分吗?也许埋在 ECMAScript 6 的某个地方?或者它只是 Chrome 的自定义功能?

是的,这些是ECMAScript 国际化 API的一部分。它与 ECMAScript 分开实现,但实现 ECMAScript 国际化 API 的要求是首先正确实现 ECMAScript 5.1

为什么只是谷歌浏览器?它在其他任何地方都支持吗?是否有计划在其他任何地方支持它?

近年来,谷歌浏览器大多率先实现新功能。Mozilla 比较保守,还是比如讨论是否实现元素的download属性。a它现在也可以在IE11 BetaOpera中使用。它将在Firefox 25中可用。

我检查了使用 Chrome 的 JavaScript 运行时的 node.js,但它在那里不起作用。为什么不?

node.js 只是使用相同的引擎,它是一个独立于 Google Chrome 浏览器的项目。该引擎只实现了 Ecmascript 5.1。这是一个扩展 node.js 现在必须单独实现。它将在第三季度的 V8 中可用,因此可能稍后您可以在 node.js 中使用它。

这专注于输出,但我将如何将其用于输入?有没有办法将构造函数中的时区传递给 Date 对象?我尝试了以下方法:

规范中没有关于输入日期的内容。我个人看不出这会有什么用,如果你不传输 UTC 时间戳,你就做错了,因为"2013-01-01 12:34:56 America/New_York"在从 DST 到标准时间的转换过程中,类似的东西是模棱两可的。

这篇文章中描述的问题是由 ECMAScript 5 规范中的一个缺陷造成的,即使正确的数据在 TZDB 中,它仍然会影响输出。

这是输入问题,不是输出。同样,使用您无法影响或检测的本地时区构建日期是错误的。使用时间戳构造函数重载或Date.UTC.

我可以期待随着 IANA 发布 TZDB 更新,Google 会推送包含这些更改的 Chrome 更新吗?

规范中没有任何内容,但我认为期望规则不会落后太多是合理的。

于 2013-07-04T22:28:04.040 回答
6

这是新标准的一部分吗?也许埋在 ECMAScript 6 的某个地方?或者它只是 Chrome 的自定义功能?

事实上,它是新 ECMA-402 标准的一部分。该标准很难阅读,但是有这个友好的介绍

为什么只是谷歌浏览器?它在其他任何地方都支持吗?是否有计划在其他任何地方支持它?

MDN 有一个支持浏览器的列表。根据错误 853301,它将在 Firefox 25 中可用。

我检查了使用 Chrome 的 JavaScript 运行时的 node.js,但它在那里不起作用。为什么不?

可能的原因很多;它不符合当前的代码库,否则会使 node.js 变得更大更慢(Mozilla 之前的错误跟踪器条目表明时区数据使 Firefox 的下载大小增加了 10%,并导致 I/O在浏览器启动期间大幅增加。

时区数据是否可以通过我列出的功能以外的任何其他方式访问?如果仅
在格式化字符串时可用,那么根据结果进行任何计算可能会很困难。

似乎它不可用。此外,Intl API Primer 谈到只有 UTC 和本地时区是绝对需要支持的。

这专注于输出,但我将如何将其用于输入?有没有办法将构造函数中的时区传递给 Date 对象?我尝试了以下方法:

Intl API 仅涉及日期/时间格式、字符串排序规则和数字格式。日期时间格式不仅支持公历,还支持多种其他历法,农历、阴阳历等。

这篇文章中描述的问题是由 ECMAScript 5 规范中的一个缺陷造成的,即使正确的数据在 TZDB 中,它仍然会影响输出。新旧实现如何共存?人们会认为这将是所有旧方式或所有新方式。例如,将我的计算机时区设置为美国东部时间:

new Date(2004,10,7,0,0).toLocaleString("en-US",{timeZone:"America/New_York"})

返回“2004 年 11 月 6 日晚上 11:00:00”。它应该返回午夜,因为我从午夜开始并且 > 我的本地时区与输出时区匹配。但由于 ES5 问题,它将提供的输入日期置于 > 错误的 UTC 点。

原因是 ES5 要求使用当前 DST 和偏移量计算新 Date 的输入,即它是美国/纽约,但使用 EDT 时区,即使 11 月 6 日不在 EDT 中。显然,由于这是如此指定,因此无法更改。但是,由于 Chrome 正在使用 TZDB 将纯 UTC 时间点值转换为 America/New York tz,因此它确实将时间视为 EST。

我可以期待随着 IANA 发布 TZDB 更新,Google 会推送包含这些更改的 Chrome 更新吗?

我会相信的

于 2013-07-30T22:32:09.343 回答