2015-10-15 105 views
0

Java和JavaScript之間的`Date`交換的最佳實踐我正在編寫需要在Java和JavaScript之間傳輸Date的Web應用程序。首先,我使用毫秒來交換日期,這裏提到:https://stackoverflow.com/a/1007854/4675827考慮到DST

但是,遇到DST時出現問題,稱爲夏令時。 Java和JavaScript的毫秒值有時會有所不同。特別是當我只存儲日期的日期部分時,我節省了時間:「2015-10-15 00:00:00」,但是當我將毫秒值傳遞給JavaScript時,它變成了「2015-10-14 23: 00:00" 。因此,日期部分有1天的差異。

我想知道在Java和JavaScript之間交換Date數據的最佳實踐是什麼,或者我可以關閉Java中的DST?

在此先感謝!


最後,我能夠通過改變傑克遜映射器,這是用來進行序列化和反序列化JSON對象的時區設置來禁用DST

我已更改爲北京時間的GMT + 8。它根本不使用DST。

mapper.setTimeZone(TimeZone.getTimeZone(ZoneId.of("GMT+8"))); 
+2

最好的做法是不使用客戶端日期來存儲數據庫 – Tushar

+0

如果你做'var d = new Date(Date.parse(2015-10-15 00:00:00));'then時間保持正確,但仍然從JS的日期不應該去數據庫 – Saar

+0

@薩爾 - 使用* Date.parse *是多餘的,因爲傳遞給Date構造函數的字符串無論如何都被解析。但是,不建議使用內置方法來解析日期字符串。此外,您建議的格式與ECMA-262 ed 5和6中規定的ISO 8601格式不一致,因此結果取決於實施。 – RobG

回答

0

您不提供任何「最佳實踐」的標準,但強大的傳輸日期和時間的方法是使用時間值。 UNIX使用自1970-01-01T00:00:00Z以來的秒數,ECMAScript自相同時期起使用毫秒,因此轉換很簡單。

如果您總是以秒或毫秒爲單位發送時間值,然後將其轉換爲客戶端系統上的日期(如果需要,將時間值轉換爲毫秒),您將始終獲得可用於在UTC或客戶端系統時區中顯示日期和時間(通常會誤認爲「區域設置」),如果有效,它將自動允許夏令時。

有很多問題都有很好的答案,例如: Convert a Unix timestamp to time in JavaScript

關於根據ISO 8601格式化的日期字符串,如2015-10-15T12:03:16Z,某些瀏覽器沒有內置支持來解析這些字符串。如果你提供一個解析器(比如寫你自己的或者使用一個小庫),那麼它們可以被可靠地容納。

ISO 8601字符串可以很方便,因爲它們比時間值更容易理解,但如果不希望人們理解數據,那麼這不是一個考慮因素。