2017-03-02 40 views
0

如果我們有包含時區信息的時間戳,如2017-07-03T17:30:00-04:00,並將其解析爲java.Date或者joda.DateTime。解析後timestamp包含timezone日期對象,Date對象是否包含時區信息

它是否包含時區信息? 我在問這個,因爲我想比較兩個不同的日期實例。因此,如果它不包含時區信息,則日差將在不同時區出錯

更新: 我運行快速單元測試來驗證,首先將日期實例轉換爲毫秒,然後在減去這兩毫秒後轉換回TimeUnit 。營業時間是不同的時區不同

+0

這兩個類的javadoc說什麼? –

+0

我認爲這應該基於計算日差的方式,首先將其轉換爲毫秒,並將這兩個日期與毫秒進行比較。但是,我運行了一個快速單元測試,它給了我不同時區的不同時間 – Cheng

回答

1

java.util.Date和Joda-Time都已被java.time類取代。

你輸入的字符串2017-07-03T17:30:00-04:00是標準的ISO 8601格式,並具有在結束偏移從-UTC。 -04:00表示該字符串表示UTC後四小時的時間。

此偏移量不是時區。時區是特定區域偏移的歷史。例如,America/BarbadosAmerica/New_York

解析你的字符串作爲java.time.OffsetDateTime對象。

OffsetDateTime odt = OffsetDateTime.parse("2017-07-03T17:30:00-04:00"); 

odt.toString():2017-07-03T17:30:00-04:00

您可以通過調用方法IsEqualisBeforeisAfter比較OffsetDateTime實例。

要查看UTC同一時刻同時,提取Instant

Instant instant = odt.toInstant() ; 

instant.toString():2017-07-03T21:30:00Z

在端的Z是短期的和Zulu裝置UTC。

0

這是要取決於你使用什麼類型的DateTime,因爲Java 8中,你有以下選擇:

  • 一個LocalDateLocalDateTime。它將放棄時區信息,只有當地時區纔會有「有效」值。如果沒有關於產生該值的服務器進程的特定時區的上下文,該值是不明確的。
  • A ZonedDateZonedDateTime。這一個保留了時區。比較仍然不明確:您遇到類似DST或日曆更改的問題(取決於您需要兼容的日期時間範圍)。爲了排序/比較的目的,您可能需要將其轉換爲參考時標,這就是爲什麼:
  • Instant表示UTC的絕對時間刻度上的特定時刻。任何Instant都可以與其他Instant直接比較,並且任何值的不確定性都可以通過Instant的定義來解決。輸入值將被轉換爲UTC中匹配的對應值,因此即使絕對時間值將被正確保存,原始時區(如果有)也將丟失。因此,例如,如果您依賴時區來決定位置或區域設置,則Instant不是一個好選擇。