Date.toLocaleString()的Chrome timeZone选项

时间:2013-07-04 21:04:48

标签: javascript google-chrome internationalization timezone ecmascript-intl

我最近发现JavaScript有一个新的扩展。这会为DatetoLocaleStringtoLocaleDateString函数中的toLocaleTimeString对象添加多个功能。 Reference here

我对支持IANA/Olson time zonestimeZone选项特别感兴趣,例如America/New_YorkEurope/London目前仅在Google Chrome中支持

以前的建议是,要使用除UTC或您自己的本地时区之外的任何其他时区的JavaScript,必须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的自定义内容?
  • 为何只使用Google 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更新吗?

2 个答案:

答案 0 :(得分:20)

更新

有关API here

的大量文章
  

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

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

  

为何只使用Google Chrome?它在其他地方是否受支持?有计划吗?   在其他任何地方支持它?

近年来,谷歌Chrome大多是第一个实施新功能的人。 Mozilla更保守,仍然在讨论是否实现download元素的a属性。它现在也可以在IE11 BetaOpera中使用。它将在Firefox 25中提供。

  

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

node.js只使用相同的引擎,即Google Chrome浏览器中的a separate project。引擎只是实现了Ecmascript 5.1。这是一个扩展node.js必须立即单独实现。它将在V8 in Q3中可用,因此您可以在node.js中使用它。

  

这主要关注输出,但我如何将其用于输入?在那儿   一种将构造函数中的时区传递给Date对象的方法?一世   尝试了以下内容:

在规范中输入日期没有任何意义。我个人看不出这会有什么用处,如果你没有发送UTC时间戳,那你就错了,因为在从DST到标准时间的过渡期间"2013-01-01 12:34:56 America/New_York"之类的东西是不明确的。

  

本文中描述的问题,由ECMAScript中的缺陷创建   5规格,即使正确的数据在中,仍会影响输出   TZDB。

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

  

我可以期待IANA向TZDB发布Google的更新吗?   会推送包含更改的Chrome更新吗?

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

答案 1 :(得分:6)

  

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

确实,它是新的ECMA-402标准的一部分。该标准很难阅读,但有this friendly introduction

  

为何只使用Google Chrome?它在其他地方是否受支持?有计划吗?   在其他任何地方支持它?

MDN has a list of supporting browsers。根据{{​​3}},它将在Firefox 25中提供。

  

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

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

  

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

似乎无法使用。此外,Intl API入门说明只需要支持UTC和本地时区。

  

这主要关注输出,但我如何将其用于输入?有没有办法通过   构造函数中的时区到Date对象?我尝试了以下方法:

Intl API仅说明日期/时间格式,字符串排序规则和数字格式。日期时间格式不仅支持格里高利历,还支持多种其他日历,月球,月球等。

  

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

     

新日期(2004,10,7,0,0).toLocaleString(“en-US”,{timeZone:“America / New_York”})

     

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

原因是ES5要求使用当前的DST和偏移计算新日期的输入,即美国/纽约但使用EDT时区,即使11月6日不在EDT中。显然,因为这是如此指定,那么它不能改变。但是,由于Chrome使用TZDB进行从简单的UTC时间点到美国/纽约tz的转换,因此它确实将时间视为在EST中。

  

我可以期待,当IANA发布TZDB更新时,Google会推送Chrome更新   包含更改?

我相信