2015-02-01 17 views
16

Theo tôi có thể nghiên cứu, UTC và Zulu giống nhau. Tuy nhiên tôi đang chạy trong khó khăn so sánh hai ZonedDateTimes tôi nhận được từ các nguồn khác nhau trong mã của tôi. Các mã sau minh họa các vấn đề:Java 8 bình đẳng của UTC và Zulu thời gian?

@Test 
public void equalsOnTimezone() throws Exception { 
    ZonedDateTime zdtUtc = ZonedDateTime.of(2015, 2, 1, 14, 30, 0, 0, ZoneId.of("UTC")); 
    ZonedDateTime zdtZ = ZonedDateTime.of(2015, 2, 1, 14, 30, 0, 0, ZoneId.of("Z")); 
    assertEquals(zdtUtc, zdtZ); // will fail 
} 

Vấn đề:

java.lang.AssertionError: expected:<2015-02-01T14:30Z[UTC]> but was:<2015-02-01T14:30Z> 

Và những gì sẽ là cách chính xác để tạo ra và so sánh giá trị dựa UTC sau đó?

Theo W3C Date and Time Formats:

Thời gian được thể hiện bằng UTC (Coordinated Universal Time), với một UTC vấn thiết kế đặc biệt ("Z").

Trả lời

19

Theo mã nguồn, ZonedDateTime.equals sử dụng ZoneId.equals để so sánh các thành phần khu id, và đó lần lượt so sánh id chứ không phải là hiệu số.

Nếu bạn muốn hai ZonedDateTime với id khu vực "khác nhau nhưng tương đương" để so sánh như bằng nhau, bạn nên tạo cho họ như thế này:

ZonedDateTime zdtUtc = ZonedDateTime.of(
    2015, 2, 1, 14, 30, 0, 0, ZoneId.of("UTC").normalized()); 
ZonedDateTime zdtZ = ZonedDateTime.of(
    2015, 2, 1, 14, 30, 0, 0, ZoneId.of("Z").normalized()); 

Tôi nghĩ rằng đây là một trường hợp mong đợi của bạn (dựa trên W3C tài liệu cho các biểu diễn chuỗi) không tương ứng với ngữ nghĩa tài liệu của các lớp Java. Trong những trường hợp như vậy, javadoc là dứt khoát.

(Đây không phải là lỗi Java 8, IMO.)

+0

Một tùy chọn khác là chuyển đổi mỗi ZonedDateTime thành Instant, vì hai Instants sẽ bằng nhau. – VGR

+0

Có ... nếu đó là những gì bạn đang cố gắng đạt được. –

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