3
date1
和date2
是不相等的在這裏,因爲不同的年表:爲什麼第一個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
。我很確定我對Chronology
和DateTimeZone
之間的區別感到困惑,所以我非常感謝,如果有人能夠指出我正在混淆的是什麼。
順便說一句,代碼是在斯卡拉和斷言來自ScalaTest,但這應該沒有任何區別。
感謝您的回覆。我現在明白了,但恕我直言,這個API有點反直覺。時區標識符對於解析是強制性的,但在向「DateTime」對象轉換完成時實際上被忽略。基本原理是什麼? –
@IonuţG.Stan:根本不會忽略時區,它用於計算(通用)時間中的精確點,然後根據當前時區中的時間點構造DateTime。 – leonbloy
嘗試添加第一個例子'assert(date1.getMillis()== date2.getMillis())'來驗證它們對應於相同的「物理」時刻。 – leonbloy