繁体   English   中英

为什么javascript几乎不支持时区?

[英]Why does javascript has a little or no support for timezones?

我一直在寻找可以支持时区的JavaScript语言。 我的动机是:

  1. 两个时区之间的无缝转换。
  2. 构造具有不同时区(以毫秒为单位)的Date对象。
  3. 根据不同的区域和区域设置日期格式。

目前,我通过从语言环境String重新构造一个新的Date对象来实现#1:

new Date(dateInSomeTimeZone.toLocaleString('en-US', {timeZone: 'Asia/Calcutta'})

这再次很不好,因为此Date的毫秒表示不同于原始日期。 还有一些方法可以实现#3,但是#2似乎是“无法实现的”。

是否有任何原因导致像JS这样的成熟语言不提供大多数框架支持的此功能? 我知道有像Moment.js这样的库在做这些事情,但是在已经运行的应用程序中并不总是可以集成一个新库。

是否有解决上述问题的方法?

您遇到的主要问题是JavaScript是一种客户端脚本语言。 这意味着JavaScript仅使用计算机认为正确的时间。 这些时间戳略有差异是因为计算机并非总是与实时完美同步。

对时区的支持非常少,因为您不能始终信任其他计算机上的时区设置。

除了原因之外,您目前已经拥有的解决方案是我建议使用的解决方案。 该代码的执行时间可能是个问题,但我认为为此添加库将花费更长的时间。

我同意JavaScript的本机日期和时间API远非理想,而且现在对大多数人来说, moment.js可能是最佳答案。

但是,作为ECMAScript国际化API (ECMA-402)的一部分, 有些事情正在改进。 第一版的某些部分已经在某些浏览器中实现,并且当前的第二版有望随着时间的推移而推出。

您在问题中给出的使用toLocaleString的示例已包含在此API中。 但是,在许多实现中缺少时区支持。 例如,您使用时区ID进行显示,该ID在Chrome上有效,但在Internet Explorer上无效。

此外,ECMA-402专注于您的第三种情况。 其他两个将需要比当前建议的更改更多的更改。

至于为什么 ,请考虑许多JavaScript Date对象在设计上与Java JDK 1.0中的原始java.util.Date类似。 当JDK 1.1出现时,该API的大部分已被弃用并移至java.util.Calendar 当您将两个Java API与应用了ECMA-402的JavaScript Date对象进行比较时,您会发现它们非常相似。

现在考虑Java开发人员在DateCalendar对象方面仍然存在很多问题,并且从这种挫败感中发展出了Joda-Time库。 最终,这些概念在Java 8的java.time包中被采用和改进。 那是一个非常成熟且经过深思熟虑的API,可能它们是您在JavaScript中寻找的东西。 只能希望Java不需要花17年的时间就能发展起来。

AFAIK,在ES6 / 2015中或计划在ES7 / 2016中没有大幅度的日期/时间改进。 因此,与此同时,它将归结为库。 片刻是个好时机。 还有其他好事,也有很多坏事,而且我敢肯定,将来两者都会更多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM