2012-09-28 24 views
3

date1date2是不相等的在這裏,因爲不同的年表:爲什麼第一個Joda DateTime實例獲得非UTC時代?

val formatter = ISODateTimeFormat.dateTimeNoMillis 
val date1 = formatter.parseDateTime("2012-01-03T00:00:00Z") 
val date2 = new DateTime(2012, 1, 3, 0, 0, DateTimeZone.UTC) 
println(date1.getChronology) // ISOChronology[Europe/Bucharest] 
println(date2.getChronology) // ISOChronology[UTC] 
assert(date1 === date2)  // fails 

在這裏,他們是平等的,雖然:

val formatter = ISODateTimeFormat.dateTimeNoMillis 
val date1 = formatter.withZone(DateTimeZone.UTC).parseDateTime("2012-01-03T00:00:00Z") 
val date2 = new DateTime(2012, 1, 3, 0, 0, DateTimeZone.UTC) 
println(date1.getChronology) // ISOChronology[UTC] 
println(date2.getChronology) // ISOChronology[UTC] 
assert(date1 === date2)  // succeeds 

我知道DateTime情況下,應該有相同的年表,以被視爲相等,但我會預期字符串中的Z標誌符會使格​​式化程序在UTC年代學中解析date1。我很確定我對ChronologyDateTimeZone之間的區別感到困惑,所以我非常感謝,如果有人能夠指出我正在混淆的是什麼。

順便說一句,代碼是在斯卡拉和斷言來自ScalaTest,但這應該沒有任何區別。

回答

3

解析將在默認時區中創建日期時間,除非它進一步配置。將「Z」考慮在內,但是必要時調整時間以匹配您的時區(布加勒斯特)。

val date1 = formatter.withOffsetParsed().parseDateTime("2012-01-03T00:00:00Z") 

添加withOffsetParsed()得到你想要的行爲。

+0

感謝您的回覆。我現在明白了,但恕我直言,這個API有點反直覺。時區標識符對於解析是強制性的,但在向「DateTime」對象轉換完成時實際上被忽略。基本原理是什麼? –

+0

@IonuţG.Stan:根本不會忽略時區,它用於計算(通用)時間中的精確點,然後根據當前時區中的時間點構造DateTime。 – leonbloy

+0

嘗試添加第一個例子'assert(date1.getMillis()== date2.getMillis())'來驗證它們對應於相同的「物理」時刻。 – leonbloy

相關問題