我最近发现JavaScript有一个新的扩展。这会为Date
,toLocaleString
和toLocaleDateString
函数中的toLocaleTimeString
对象添加多个功能。 Reference here
我对支持IANA/Olson time zones的timeZone
选项特别感兴趣,例如America/New_York
或Europe/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)
非常酷,但我有几个问题:
这主要关注输出,但我如何将其用于输入?有没有办法将构造函数中的时区传递给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更新吗?
答案 0 :(得分:20)
有关API here
的大量文章这是新标准的一部分吗?也许埋在ECMAScript的某个地方 6?或者它只是Chrome的自定义内容?
是的,这些是ECMAScript Internationalization API的一部分。它与ECMAScript分开实现,但实现ECMAScript Internationalization API的要求是首先正确实现ECMAScript 5.1
为何只使用Google Chrome?它在其他地方是否受支持?有计划吗? 在其他任何地方支持它?
近年来,谷歌Chrome大多是第一个实施新功能的人。 Mozilla更保守,仍然在讨论是否实现download
元素的a
属性。它现在也可以在IE11 Beta和Opera中使用。它将在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更新 包含更改?
我相信