簡體   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