[英]Why does javascript has a little or no support for timezones?
我一直在尋找可以支持時區的JavaScript語言。 我的動機是:
目前,我通過從語言環境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開發人員在Date
和Calendar
對象方面仍然存在很多問題,並且從這種挫敗感中發展出了Joda-Time庫。 最終,這些概念在Java 8的java.time
包中被采用和改進。 那是一個非常成熟且經過深思熟慮的API,可能它們是您在JavaScript中尋找的東西。 只能希望Java不需要花17年的時間就能發展起來。
AFAIK,在ES6 / 2015中或計划在ES7 / 2016中沒有大幅度的日期/時間改進。 因此,與此同時,它將歸結為庫。 片刻是個好時機。 還有其他好事,也有很多壞事,而且我敢肯定,將來兩者都會更多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.