2016-11-10 27 views
6

Tôi hiểu rằng ZonedDateTime thực sự là phiên bản nâng cao của Instant. Nó có tất cả dữ liệu mà Instant có (giá trị chính xác theo thời gian UTC), cộng với thông tin múi giờ. Vì vậy, giả thiết ngây thơ của tôi là một số ZonedDateTimelà mộtInstant và rằng bất kỳ phương pháp nào tham gia Instant sẽ vui vẻ thay thế ZonedDateTime. Hơn nữa, tôi mong đợi isBefore(), isAfter() v.v. để hoạt động liên tục giữa Instant s và ZonedDateTime s.Khả năng tương thích giữa Instant và ZonedDateTime

Xem tài liệu API cho InstantZonedDateTime, không có trường hợp nào trong số này xảy ra. Tôi có thể so sánh Instant s với Instant s và ZonedDateTime s với ZonedDateTime s, nhưng hai lớp dường như không tương thích. Hơn nữa, mã của bên thứ ba như ThreeTen-Extra's Interval dường như chỉ hoạt động với Instant s.

Có lý do tại sao InstantZonedDateTime không có nghĩa là để được trộn lẫn?

+0

Vâng, tài liệu nói rõ ràng rằng nó nên được xem như là một 'LocalDateTime' được kết hợp với một vùng, lưu ý là một' Instant' kết hợp với một vùng. Nó có tất cả các trường ngày-thời gian, không phải là một bù đắp từ một điểm trong UTC. Tại sao bạn mong đợi nó hoạt động khác với tài liệu của nó nói? – RealSkeptic

+0

Bạn có thể chuyển đổi 'ZonedDateTime' thành' Instant' bằng cách sử dụng ['.toInstant()'] (http://docs.oracle.com/javase/8/docs/api/java/time/chrono/ChronoZonedDateTime.html # toInstant--), nhưng để chuyển đổi từ 'Instant' thành' ZonedDateTime', bạn phải sử dụng ['ZonedDateTime.ofInstant'] (http://docs.oracle.com/javase/8/docs/api/java /time/ZonedDateTime.html#ofInstant-java.time.Instant-java.time.ZoneId-) và chỉ định 'ZoneId'. – Powerlord

Trả lời

5

Vì bản dịch không được tiêm. Chủ nhật, ngày 30 tháng 10 năm 2016 2:15 sáng tại Đức/Munich, ví dụ: Instant ngày/giờ này đại diện cho ai? Điều này không phải trả lời độc lập mà không có một số giả định vì bạn không biết liệu thời gian này có nên được dịch sang số Instanttrước hoặc sau khoản bù cho thời gian tiết kiệm ánh sáng ban ngày (DST) hay không. Hoặc Chủ nhật, ngày 27 tháng 3 năm 2016 2:15 sáng tại Đức/Munich: Không thể tồn tại kết hợp ngày/giờ này vì đồng hồ sẽ được đặt thành 3 giờ sáng khi đạt đến 2 giờ sáng.

Nếu không có DST ba trường hợp có thể dịchthành Instant (khớp chính xác, khoảng cách mùa hè, chồng chéo mùa đông) sẽ được giảm xuống một và chuyển đổi sẽ được tiêm, AFAIK.

Chỉnh sửa: "Thực hiện" vấn đề này, khi hiển thị ngày/giờ trong ứng dụng dựa trên JSF của chúng tôi, chúng tôi luôn tính chuyển khoản được tính tương ứng cho trạng thái hiện tại của DST vào trình định dạng.

+0

Trạng thái tài liệu ZonedDateTime: "Lớp này lưu trữ ... vùng bù được sử dụng để xử lý ngày giờ địa phương không rõ ràng". Điều đó không có nghĩa là có một ánh xạ rõ ràng từ ZonedDateTime đến Instant? –

5

InstantZonedDateTime có trạng thái khác nhau - Instant chỉ là một số nano giây từ thời đại, trong khi ZonedDateTime bao gồm một LocalDateTime, ZoneIdZoneOffset. Như vậy, hai lớp có thể được chuyển đổi thành/từ mỗi khác, nhưng không giống nhau (và bạn mất thông tin khi chuyển đổi ZonedDateTime thành Instant).

Hành vi của isBefore()isAfter() khớp chính xác giữa hai tuy nhiên. Trong khi việc thực hiện Comparable phù hợp với hành vi được đề nghị, đó là "Đó là khuyến khích mạnh mẽ (mặc dù không bắt buộc) rằng trật tự tự nhiên phù hợp với bằng." I E. compareTo() tính đến ngày giờ địa phương, múi giờ và chênh lệch, trong khi isBefore()isAfter() chỉ xem xét ngay lập tức.

Viết một so sánh để so sánh một InstantZonedDateTime là tương đối đơn giản:

Comparator<TemporalAccessor> comparator = 
    (a, b) -> Instant.from(a).compareTo(Instant.from(b)); 

mà cũng có thể được viết như sau:

Comparator<TemporalAccessor> comparator = Comparator.comparing(Instant::from); 
Các vấn đề liên quan