2016-09-15 25 views
46

Tại saoTại sao ZoneOffset.UTC! = ZoneId.of ("UTC")?

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

in ra false?

Tôi mong đợi cả hai khu vực được phân vùngDateTimes sẽ bằng nhau.

Trả lời

60

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 
6

Nếu bạn đặt tất cả trong số họ trong chuỗi, bạn sẽ thấy rằng một trong những đầu tiên là 2016 -09-15T09: 01: 13.816Z và điều thứ hai là 2016-09-15T09: 01: 13.816Z [UTC] họ thực sự giống nhau nhưng với zoneID bạn sẽ có được một phụ [UTC]

EDIT: Kiểm tra @DVarga s trả lời để có được nó theo cách bạn muốn

Các vấn đề liên quan