爲什麼爲什麼ZoneOffset.UTC!= ZoneId.of(「UTC」)?
ZonedDateTime now = ZonedDateTime.now();
System.out.println(now.withZoneSameInstant(ZoneOffset.UTC)
.equals(now.withZoneSameInstant(ZoneId.of("UTC"))));
打印出來false
?
我認爲這兩個zonedDateTimes是相等的。
爲什麼爲什麼ZoneOffset.UTC!= ZoneId.of(「UTC」)?
ZonedDateTime now = ZonedDateTime.now();
System.out.println(now.withZoneSameInstant(ZoneOffset.UTC)
.equals(now.withZoneSameInstant(ZoneId.of("UTC"))));
打印出來false
?
我認爲這兩個zonedDateTimes是相等的。
答案來自javadoc of ZoneId
...
一個是了zoneid用於識別用於將 即時和LocalDateTime之間進行轉換的規則。有兩種不同類型的ID:
- 固定偏移 - 完全解析從UTC /格林威治,使用所有本地日期時間
- 地理區域相同的偏移偏移 - 一個區域,其中一組特定的從UTC /格林威治發現偏移的規則適用
大多數固定偏移由ZoneOffset表示。 在任何ZoneId上調用標準化() 將確保將固定偏移ID作爲ZoneOffset表示爲 。
...,然後從javadoc of ZoneId#of
:
這種方法解析產生了zoneid或ZoneOffset的ID。 A 如果ID是'Z',或者以'+'或' - '開始,則返回ZoneOffset。
參量ID被指定爲"UTC"
,因此它會返回與一個ZoneId
偏移量,這在字符串形式還提出:
System.out.println(now.withZoneSameInstant(ZoneOffset.UTC));
System.out.println(now.withZoneSameInstant(ZoneId.of("UTC")));
輸出:
2017-03-10T08:06:28.045Z
2017-03-10T08:06:28.045Z[UTC]
當您使用equals
方法進行比較時,您可以檢查對象等值。由於所述差異,評估結果爲false
。
當使用normalized()
方法如文檔中提出的,使用equals
比較將返回true
,如normalized()
將返回對應ZoneOffset
:
標準化該時區ID,返回一個ZoneOffset儘可能。
now.withZoneSameInstant(ZoneOffset.UTC)
.equals(now.withZoneSameInstant(ZoneId.of("UTC").normalized())); // true
隨着文檔狀態,如果使用"Z"
或"+0"
作爲輸入ID,of
將直接返回了ZoneOffset
並沒有必要調用normalized()
:
now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("Z"))); //true
now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("+0"))); //true
要如果他們存儲了相同的日期時間,則可以使用isEqual
方法代替:
now.withZoneSameInstant(ZoneOffset.UTC)
.isEqual(now.withZoneSameInstant(ZoneId.of("UTC"))); // true
樣品
System.out.println("equals - ZoneId.of(\"UTC\"): " + nowZoneOffset
.equals(now.withZoneSameInstant(ZoneId.of("UTC"))));
System.out.println("equals - ZoneId.of(\"UTC\").normalized(): " + nowZoneOffset
.equals(now.withZoneSameInstant(ZoneId.of("UTC").normalized())));
System.out.println("equals - ZoneId.of(\"Z\"): " + nowZoneOffset
.equals(now.withZoneSameInstant(ZoneId.of("Z"))));
System.out.println("equals - ZoneId.of(\"+0\"): " + nowZoneOffset
.equals(now.withZoneSameInstant(ZoneId.of("+0"))));
System.out.println("isEqual - ZoneId.of(\"UTC\"): "+ nowZoneOffset
.isEqual(now.withZoneSameInstant(ZoneId.of("UTC"))));
輸出:
equals - ZoneId.of("UTC"): false
equals - ZoneId.of("UTC").normalized(): true
equals - ZoneId.of("Z"): true
equals - ZoneId.of("+0"): true
isEqual - ZoneId.of("UTC"): true
如果你把他們都在字符串中,你會看到,第一個是 2016 -09-15T09: 01:13.816Z,第二個是2016-09-15T09:01:13.816Z [UTC]他們實際上是相同的,但與你了zoneid得到一個額外的[UTC]
編輯:檢查@DVarga爲了以你想要的方式得到它的答案