为什么javascript很少或根本不支持时区



我在javascript中寻找可以支持时区的东西。我的动机是:

  1. 两个时区之间的无缝转换
  2. 构造具有从毫秒开始的不同时区的Date对象
  3. 根据不同的区域和地区设置日期格式

目前,我正在通过从区域设置String构造回一个新的Date对象来实现#1:

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

这又是糟糕的,因为这个日期的millis表示与原始日期不同。还有一些方法可以实现#3,但#2似乎是"不可实现的"。

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

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

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

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

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

我同意JavaScript的原生日期和时间API远非理想,moment.js可能是目前大多数人的最佳答案。

然而,作为ECMAScript国际化API(ECMA-402)的一部分,有一些正在改进。第1版的部分内容已经在一些浏览器中实现,目前的第2版有望随着时间的推移推出。

您在问题中给出的使用toLocaleString的示例包含在本API中。然而,在许多实现中都缺乏时区支持。例如,您展示了使用时区ID,该ID可以在Chrome上使用,但不能在Internet Explorer上使用。

此外,ECMA-402专注于您的第三个场景。另外两项将需要比目前提议的更多的修改。

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

现在考虑一下,Java开发人员在DateCalendar对象方面仍然存在很多问题,Joda Time库也因此而发展起来。最后,这些概念在Java 8的java.time包中得到了采用和改进。这是一个非常成熟和深思熟虑的API,很可能是你在JavaScript中寻找的东西。人们只能希望Java不会花17年的时间来进化。

AFAIK,2015年6月ESK或2016年7月ESK中没有此类日期/时间的大幅改进。因此,在此期间,它将归结为图书馆。这是一个好时机。还有其他好的,也有很多坏的,我相信未来两者都会更多。

相关内容

  • 没有找到相关文章

最新更新