我正在寻找可以支持时区的javascript。我的动机是:
目前我通过从locale String构造一个新的Date对象来实现#1:
new Date(dateInSomeTimeZone.toLocaleString('en-US', {timeZone: 'Asia/Calcutta'})
这又是坏事,因为这个日期的millis表示与原始日期不同。还有一些方法可以实现#3,但#2似乎是“无法实现的”#。
有没有理由说像JS这样的成熟语言没有提供大多数框架支持的这个功能?我知道像Moment.js这样的库可以做这些事情,但是在已经运行的应用程序中并不总是可以集成新的库。
如果有上述各点的解决方案?
答案 0 :(得分:2)
您遇到的主要问题是JavaScript是一种客户端脚本语言。这意味着JavaScript只使用计算机认为正确的时间。与这些时间戳略有不同,因为计算机并不总是与实时完美同步。
对时区的支持非常小,因为您无法始终信任不同计算机上的时区设置。
除了原因之外,你现在已经拥有的解决方案是我建议使用的解决方案。该代码的执行时间可能有问题,但我认为为此添加库需要更长的时间。
答案 1 :(得分:1)
我同意JavaScript的原生日期和时间API远非理想,moment.js可能是目前大多数人的最佳答案。
然而,作为ECMAScript Internationalization API(ECMA-402)的一部分,一些正在改进。第一版的部分内容已在某些浏览器中实现,当前的第2版将有望推出。
此API涵盖了您使用toLocaleString
在问题中提供的示例。但是,在许多实现中缺少时区支持。例如,您使用时区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开发人员在Date
和Calendar
个对象上仍然存在很多问题,并且由于这种挫败感增加了Joda-Time库。最后,在Java 8's java.time
package中采用并改进了这些概念。这是一个非常成熟且经过深思熟虑的API,可能它们是您在JavaScript中寻找的类型。人们只能希望它不会花费17年来Java的发展。
AFAIK,在ES6 / 2015中没有这种类型的大幅日期/时间改进,或计划用于ES7 / 2016。所以在此期间,它将归结为图书馆。时刻是一个很好的时刻。还有其他很好的,很多坏的,我相信将来会有更多的。+ / p>