tl; dr
Instant.ofEpochMilli(1_360_753_217_219L) // UTC
2013-02-13T11: 00: 17.219Z
Instant.ofEpochMilli(1_360_753_217_219L)
.atZone(ZoneId.of("Europe/Istanbul")) // Same moment, two hours *ahead* of UTC.
2013-02-13T13: 00: 17,219 + 02: 00 [Châu Âu/Istanbul]
Instant.ofEpochMilli(1_360_753_217_219L)
.atZone(ZoneId.of("America/Caracas")) // Same moment, four-and-a-half hours *behind* UTC.
2013-02-13T06: 30: 17,219-04: 30 [Mỹ/Caracas]
Sử dụng java.time
Bạn đang sử dụng các lớp học ngày thời gian cũ phiền hà kèm với sớm nhất phiên bản Java. Chúng bây giờ là di sản, được thay thế bởi các lớp java.time, thư viện thời gian tốt nhất trên bất kỳ nền tảng nào.
Bắt đầu với số mili giây của bạn kể từ ngày epoch reference date vào đầu năm 1970 ở UTC (1970-01-01T00: 00: 00Z). Những người khác chỉ ra rằng bạn có thể không hiểu rằng một ngày tham chiếu thời đại có một múi giờ, và ở đây với kỷ nguyên này mà khu vực là UTC, một sự bù đắp của 0 giờ. Tất cả các bù trừ khác được tính dựa vào số dư này, số giờ và số phút trước UTC hoặc sau UTC.
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).
long input = 1_360_753_217_219L ;
Instant instant = Instant.ofEpochMilli(input) ;
instant.toString(): 2013-02-13T11: 00: 17.219Z
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 Múi giờ.
Múi giờ là lịch sử của những thay đổi trong quá khứ, hiện tại và tương lai đối với chênh lệch được sử dụng bởi một khu vực cụ thể.
Chỉ định proper time zone name ở định dạng continent/region
, chẳng hạn như America/Montreal
, Africa/Casablanca
hoặc Pacific/Auckland
. Không bao giờ sử dụng từ viết tắt 3-4 ký tự như EST
hoặc IST
vì chúng là không múi giờ thực, không được chuẩn hóa và thậm chí không độc đáo (!).
ZoneId zEurope_Istanbul = ZoneId.of("Europe/Istanbul") ;
ZonedDateTime zdtEurope_Istanbul = instant.atZone(zEurope_Istanbul) ;
zdtEurope_Istanbul.toString(): 2013-02-13T13: 00: 17,219 + 02: 00 [Châu Âu/Istanbul]
Bạn có thể áp dụng múi giờ khác.
ZoneId zAmerica_Caracas = ZoneId.of("America/Caracas") ;
ZonedDateTime zdtAmerica_Caracas = zdtEurope_Istanbul.withZoneSameInstant(zAmerica_Caracas) ;
zdtAmerica_Caracas.toString(): 2013-02-13T06: 30: 17,219-04: 30 [Mỹ/Caracas]
Xem code live at IdeOne.com này.
Cả ba đối tượng, ngay lập tức & zdtEurope_Istanbul & zdtAmerica_Caracas, tất cả các đại diện lúc đồng thời rất giống, điểm giống nhau trên timeline.
Số đếm từ thời đại của bạn đại diện cho 11 giờ sáng theo giờ UTC. Istanbul là hai giờ trước của UTC, do đó, thời gian trong ngày tại cùng một thời điểm là hai giờ sau 11 giờ sáng, 1 giờ chiều (13:00). Venezuela là bốn giờ rưỡi phía sau UTC, do đó, thời gian trong ngày tại cùng một thời điểm là 6:30 sáng. Tất cả đều có ý nghĩa, tất cả cùng một thời điểm nhưng thời gian đồng hồ treo tường khác nhau.
ISO 8601
Không sử dụng số đếm từ thời đại để trao đổi hoặc lưu trữ các giá trị ngày giờ. Đó là dễ bị lỗi, không thể đọc được một cách có ý nghĩa bởi con người và không rõ ràng vì có ít nhất một vài ngày tham chiếu epoch được sử dụng bởi các hệ thống phần mềm khác nhau và các chi tiết khác nhau (toàn bộ giây, mili giây, micro giây, nano giây, v.v.).
Khi chuyển giá trị ngày giờ ngoài JVM của bạn, hãy sử dụng các định dạng chuẩn ISO 8601 để trình bày văn bản. Các lớp java.time sử dụng các định dạng chuẩn theo mặc định khi phân tích cú pháp/tạo chuỗi. Bạn có thể xem các định dạng đó trong mã ví dụ của Câu trả lời này.
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.
'console.log ((ngày mới (1360753217219)). ToString())' và 'console.log ((ngày mới (1360753217219)). ToUTCString())' cung cấp cho bạn? – robertc
Tôi xin lỗi, tôi không thấy vấn đề. 6:30 ở Caracas là 13:00 ở Thổ Nhĩ Kỳ. Chỉ cần bạn đang cố gắng làm gì? – arcy
mili giây tương đối so với UTC, điểm là gì? –