Câu trả lời xuất phát từ javadoc of ZoneId
...
Một ZoneId được sử dụng để xác định các quy tắc sử dụng để chuyển đổi giữa một tức thì và một LocalDateTime. Có hai loại riêng biệt của ID:
- offsets cố định - một giải quyết hoàn toàn bù đắp từ UTC/Greenwich, mà sử dụng cùng một bù đắp đối với tất cả ngày-giờ địa phương
- Vùng địa lý - một khu vực nơi một tập hợp cụ thể của quy tắc để tìm khoản chênh lệch từ UTC/Greenwich áp dụng
Hầu hết các khoảng bù cố định được đại diện bởi ZoneOffset. Gọi điện được chuẩn hóa() trên bất kỳ ZoneId nào sẽ đảm bảo rằng một ID bù đắp cố định sẽ được biểu thị làm một ZoneOffset.
... và từ javadoc of ZoneId#of
:
Phương pháp này phân tích các ID tạo ra một ZoneId hoặc ZoneOffset. A ZoneOffset được trả lại nếu ID là 'Z' hoặc bắt đầu bằng '+' hoặc '-'.
id luận được quy định như "UTC"
, do đó nó sẽ trả về một ZoneId
với một bù đắp, mà còn thể hiện dưới dạng chuỗi:
System.out.println(now.withZoneSameInstant(ZoneOffset.UTC));
System.out.println(now.withZoneSameInstant(ZoneId.of("UTC")));
Đầu ra:
2017-03-10T08:06:28.045Z
2017-03-10T08:06:28.045Z[UTC]
Khi bạn sử dụng phương pháp equals
để so sánh, bạn kiểm tra đối tượng tương đương. Do sự khác biệt được mô tả, kết quả của việc đánh giá là false
.
Khi phương pháp normalized()
được sử dụng như đề xuất trong tài liệu, so sánh sử dụng equals
sẽ trở lại true
, như normalized()
sẽ trả lại tương ứng ZoneOffset
:
bình thường hóa các ID múi giờ, trả lại một ZoneOffset nếu có thể .
now.withZoneSameInstant(ZoneOffset.UTC)
.equals(now.withZoneSameInstant(ZoneId.of("UTC").normalized())); // true
Theo các tiểu bang tài liệu, nếu bạn sử dụng "Z"
hoặc "+0"
như input id, of
sẽ trả lại ZoneOffset
trực tiếp và không có nhu cầu gọi normalized()
:
now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("Z"))); //true
now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("+0"))); //true
Để kiểm tra nếu chúng lưu trữ cùng một ngày, bạn có thể sử dụng phương thức isEqual
thay thế:
now.withZoneSameInstant(ZoneOffset.UTC)
.isEqual(now.withZoneSameInstant(ZoneId.of("UTC"))); // true
mẫu
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"))));
ra:
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