web-dev-qa-db-ja.com

なぜZoneOffset.UTC!= ZoneId.of( "UTC")なのですか?

どして

ZonedDateTime now = ZonedDateTime.now();
System.out.println(now.withZoneSameInstant(ZoneOffset.UTC)
        .equals(now.withZoneSameInstant(ZoneId.of("UTC"))));

falseを印刷しますか?

両方のZonedDateTimeインスタンスが等しくなることを期待します。

88

答えは ZoneIdのjavadoc (私の強調)から来ています...

ZoneIdは、InstantとLocalDateTimeの間の変換に使用される規則を識別するために使用されます。 IDには2つの異なるタイプがあります。

  • 固定オフセット - UTC /グリニッジ標準時からの完全に解決されたオフセット。すべてのローカル日時に同じオフセットを使用します。
  • 地理的地域 - UTC /グリニッジからのオフセットを見つけるための特定の一連の規則が適用される領域

ほとんどの固定オフセットはZoneOffsetで表されます。 任意のZoneIdでNormalized()を呼び出すと、固定オフセットIDがZoneOffsetとして表されるようになります。

...そして ZoneId#ofのjavadoc (私の強調)から:

このメソッドはIDを解析してZoneIdまたはZoneOffsetを生成します。 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() メソッドが使用されている場合、normalized()は対応するequalsを返すので、trueを使った比較は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
129
DVarga