tl; dr
Instant.ofEpochMilli(170_798_400_000L)
1975-05-31T20: 00: 00Z
... và ...
Instant.ofEpochMilli(170_798_400_000L)
.atZone(ZoneId.of("Europe/Moscow"))
1975-05-31T23: 00 + 03: 00 [Châu Âu/Moscow]
Xem live code.
Sử dụng java.time
Cách tiếp cận hiện đại sử dụng các lớp java.time trong Java 8 trở lên.
Bạn đang sử dụng các lớp ngày giờ khó xử cũ trong Java hiện là cũ. Trong số nhiều vấn đề trên các lớp đó là tính năng có chủ ý nhưng khó hiểu của phương pháp Date::toString
áp dụng múi giờ mặc định hiện tại trong khi tạo chuỗi. Giá trị bên trong thực sự luôn ở dạng UTC, nhưng toString
tạo ra ảo giác rằng Date
có múi giờ khi thực tế nó không có. Điều đó giải thích bí ẩn của bạn MSK
.
[Thậm chí còn khó hiểu hơn, thực tế là là múi giờ được chôn sâu trong Date
nhưng không liên quan đến cuộc thảo luận này. Những lớp học cũ Date
/Calendar
là một mớ hỗn độn khủng khiếp. May mắn là Java hiện có khung thời gian tốt nhất trong mọi nền tảng: java.time.]
Rõ ràng đầu vào của bạn biểu thị số mili giây từ kỷ nguyên Unix 1970-01-01T00: 00: 00Z.
Lớp Instant
đại diện cho một thời điểm trên dòng thời gian ở UTC với độ phân giải nanoseconds (tối đa chín (9) chữ số thập phân). Lớp này có thể phân tích trực tiếp số đầu vào của bạn.
Instant instant = Instant.ofEpochMilli(170_798_400_000L) ;
instant.toString(): 1975-05-31T20: 00: 00Z
Nếu bạn muốn để thấy rằng cùng một thời điểm thông qua ống kính của một khu vực cụ thể của wall-clock time, áp dụng một thời gian vùng.Áp dụng một số ZoneId
để nhận đối tượng ZonedDateTime
.
ZoneId z = ZoneId.of("Europe/Moscow") ;
ZonedDateTime zdt = instant.atZone(z) ;
1975-05-31T23: 00 + 03: 00 [Châu Âu/Moscow]
thư viện JavaScript là không chính xác
Kết quả của cuộc gọi của bạn đến thư viện JavaScript là không chính xác với độ lệch của nó là +04: 00. According to Wikipedia, thời gian Moscow từ 1930 đến 1981 là ba giờ trước, +03: 00. Khung công tác java.time mang lại kết quả chính xác của +03: 00 trong suốt năm 1975. Xem Time in Russia để biết thêm thông tin. Caveat: Tôi không phải là chuyên gia thời Nga/Liên Xô.
Về java.time
Khung java.time được xây dựng vào Java 8 và sau đó. Các lớp này thay thế các lớp học ngày giờ legacy phiền hà cũ như java.util.Date
, Calendar
, & SimpleDateFormat
.
Dự án Joda-Time, hiện đang ở maintenance mode, khuyên di chuyển đến các lớp java.time.
Để tìm hiểu thêm, hãy xem Oracle Tutorial. Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310.
Nơi lấy các lớp java.time?
Dự án mở rộng ThreeTen-Extra java.time với các lớp bổ sung. Dự án này là một nền tảng chứng minh cho những bổ sung có thể có trong tương lai vào java.time. Bạn có thể tìm thấy một số lớp học hữu ích tại đây như Interval
, YearWeek
, YearQuarter
và more.
Có thể điều này liên quan đến "Thay đổi múi giờ": http://en.wikipedia.org/wiki/Moscow_Time –
Chắc chắn là như vậy. Điều đó có nghĩa là Date constructor không thể được sử dụng trong javascript nữa? – ike3
Vâng, nếu một trong số họ đưa ra câu trả lời đúng, nhưng không phải là câu trả lời đúng, thì tôi muốn nói câu trả lời khác có lỗi :-) Java có đúng hay là JavaScript? Tôi sắp xếp kỳ vọng phiên bản Java để đưa ra câu trả lời đúng, nhưng đó chỉ là một sự nghi ngờ. – Pointy