ZoneOffset.UTC! = ZoneId.of (“UTC”) neden?


126

Neden yapar

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

çıktı falsemı?

Her iki ZonedDateTimedurumun da eşit olmasını beklerdim .

Yanıtlar:


181

Cevap (vurgu benim) javadoc'tanZoneId geliyor ...

ZoneId, Anlık ve YerelTarih Zamanları arasında dönüştürme yapmak için kullanılan kuralları tanımlamak için kullanılır. İki farklı kimlik türü vardır:

  • Sabit ofsetler - tüm yerel tarih-saatler için aynı ofseti kullanan UTC / Greenwich'ten tamamen çözümlenmiş bir fark
  • Coğrafi bölgeler - UTC / Greenwich'ten farkı bulmak için belirli bir kurallar dizisinin uygulandığı bir alan

Sabit ofsetlerin çoğu ZoneOffset ile temsil edilir. Herhangi bir ZoneId üzerinde normalized () 'i çağırmak, sabit bir ofset ID'sinin ZoneOffset olarak temsil edilmesini sağlayacaktır.

... ve javadoc'tanZoneId#of (vurgu benim):

Bu yöntem, ZoneId veya ZoneOffset üreten kimliği ayrıştırır. Kimlik "Z" ise veya "+" veya "-" ile başlıyorsa bir ZoneOffset döndürülür .

Bağımsız değişken kimliği olarak belirtilir "UTC", bu nedenle ZoneIdbir uzaklığı olan a döndürür ve bu da dize biçiminde sunulur:

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

Çıktılar:

2017-03-10T08:06:28.045Z
2017-03-10T08:06:28.045Z[UTC]

equalsKarşılaştırma için yöntemi kullandıkça, nesne denkliğini kontrol edersiniz . Tanımlanan fark nedeniyle, değerlendirmenin sonucu false.

Tüm normalized()belgelerinde önerildiği gibi bir yöntem kullanılır, kullanılarak karşılaştırma equalsdöner trueolarak normalized()karşılık gelen döner ZoneOffset:

Mümkün olduğunda bir ZoneOffset döndürerek saat dilimi kimliğini normalleştirir.

now.withZoneSameInstant(ZoneOffset.UTC)
    .equals(now.withZoneSameInstant(ZoneId.of("UTC").normalized())); // true

Belgelerin belirttiği gibi, kullanırsanız "Z"veya "+0"giriş kimliği olarak, doğrudan ofdöndürür ZoneOffsetve aramanıza gerek yoktur normalized():

now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("Z"))); //true
now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("+0"))); //true

Aynı tarih saatini saklayıp saklamadıklarını kontrol etmek için, isEqualbunun yerine yöntemi kullanabilirsiniz :

now.withZoneSameInstant(ZoneOffset.UTC)
    .isEqual(now.withZoneSameInstant(ZoneId.of("UTC"))); // true

Örneklem

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"))));

Çıktı:

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

4
Dokümanlar ayrıca "Bölge kimliği" GMT "," UTC "veya" UT "değerine eşitse, sonuç aynı kimliğe ve ZoneOffset.UTC'ye eşdeğer kurallara sahip bir Bölge Kimliği olur" der. Aynı kimlik ve kurallar, ancak farklı davranış. ZoneId.of("Z")verir ZoneOffset.UTCama ZoneId.of("UTC")size bir verir ZoneId(bu değildir ZoneOffset.UTC). Bu API, en hafif tabirle sezgisel değil.
Adam Millerchip
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.