A resposta vem do javadoc deZoneId
(ênfase minha) ...
Um ZoneId é usado para identificar as regras usadas para converter entre um Instant e um LocalDateTime. Existem dois tipos distintos de ID:
- Compensações fixas - uma compensação totalmente resolvida do UTC / Greenwich, que usa a mesma compensação para todas as datas e horários locais
- Regiões geográficas - uma área em que se aplica um conjunto específico de regras para encontrar a compensação do UTC / Greenwich
A maioria das compensações fixas é representada pelo ZoneOffset. Chamar normalizado () em qualquer ZoneId garantirá que um ID de deslocamento fixo seja representado como um ZoneOffset.
... e do javadoc deZoneId#of
(ênfase minha):
Este método analisa o ID que produz um ZoneId ou ZoneOffset. Um ZoneOffset será retornado se o ID for 'Z' ou iniciar com '+' ou '-' .
O ID do argumento é especificado como "UTC"
, portanto, ele retornará a ZoneId
com um deslocamento, que também é apresentado no formato string:
System.out.println(now.withZoneSameInstant(ZoneOffset.UTC));
System.out.println(now.withZoneSameInstant(ZoneId.of("UTC")));
Saídas:
2017-03-10T08:06:28.045Z
2017-03-10T08:06:28.045Z[UTC]
Ao usar o equals
método de comparação, você verifica a equivalência do objeto . Devido à diferença descrita, o resultado da avaliação é false
.
Quando o normalized()
método é usado conforme proposto na documentação, a comparação usando equals
retornará true
, assim como normalized()
retornará o correspondente ZoneOffset
:
Normaliza o ID do fuso horário, retornando um ZoneOffset sempre que possível.
now.withZoneSameInstant(ZoneOffset.UTC)
.equals(now.withZoneSameInstant(ZoneId.of("UTC").normalized())); // true
Como a documentação declara, se você usar "Z"
ou "+0"
como ID de entrada, of
retornará o ZoneOffset
diretamente e não será necessário chamar normalized()
:
now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("Z"))); //true
now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("+0"))); //true
Para verificar se eles armazenam a mesma data e hora , você pode usar o isEqual
método:
now.withZoneSameInstant(ZoneOffset.UTC)
.isEqual(now.withZoneSameInstant(ZoneId.of("UTC"))); // true
Amostra
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"))));
Resultado:
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
ZoneId.of("Z")
dá a você,ZoneOffset.UTC
masZoneId.of("UTC")
dá a vocêZoneId
(isso não éZoneOffset.UTC
). Essa API não é intuitiva, para dizer o mínimo.