1. ホーム
  2. java

[解決済み] ZoneOffset.UTCとZoneId.of("UTC")の違いは何ですか?

2022-04-30 15:20:19

質問

なぜ

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

プリントアウト false ?

私は、両方の ZonedDateTime のインスタンスが等しくなるようにします。

どのように解決するのですか?

その答えは のjavadocを参照してください。 ZoneId は(強調) ...

ZoneIdは、以下の変換に使用されるルールを識別するために使用されます。 InstantとLocalDateTimeを比較する。IDには2つの異なるタイプがあります。

  • 固定オフセット - UTC/グリニッジからの完全に解決されたオフセットで、すべてのローカルな日付時刻に同じオフセットを使用します。
  • 地理的地域 - UTC/グリニッジからのオフセットを求めるための特定のルールセットが適用される地域

ほとんどの固定オフセットはZoneOffsetで表される。 normalized()を呼び出すと は、任意のZoneIdに対して、固定オフセットIDを確実に表現します。 をZoneOffsetとする。

... そして の javadoc を参照してください。 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