tl; dr
Instant.ofEpochMilli( 1_322_018_752_992L ) // Parse count of milliseconds-since-start-of-1970-UTC into an `Instant`.
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Assign a time zone to the `Instant` to produce a `ZonedDateTime` object.
Chi tiết
Các câu trả lời khác sử dụng các lớp lỗi thời hoặc không chính xác.
Tránh các lớp thời gian cũ như java.util.Date/.CalWiki. Họ đã được chứng minh là thiết kế kém, khó hiểu và rắc rối.
java.time
Các java.time khuôn khổ đi kèm được xây dựng vào Java 8 và sau đó. Phần lớn chức năng được nhập vào Java 6 & 7 và tiếp tục thích nghi với Android . Được tạo ra bởi một số người giống như đã tạo ra Joda-Time .
An Instant
là một khoảnh khắc trên dòng thời gian trong UTC với độ phân giải nano giây . Kỷ nguyên của nó là khoảnh khắc đầu tiên của năm 1970 tại UTC.
Giả sử dữ liệu đầu vào của bạn là số mili giây từ 1970-01-01T00: 00: 00Z (không rõ ràng trong Câu hỏi), thì chúng ta có thể dễ dàng khởi tạo một Instant
.
Instant instant = Instant.ofEpochMilli( 1_322_018_752_992L );
tức thì.toString (): 2011-11-23T03: 25: 52.992Z
Các Z
trong đó tiêu chuẩn ISO 8601 định dạng chuỗi là chữ viết tắt Zulu
và nghĩa UTC .
Áp dụng múi giờ bằng cách sử dụng tên múi giờ thích hợp , để có được a ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = instant.atZone( zoneId );
Xem mã này chạy trực tiếp tại IdeOne.com .
Asia/Kolkata
Múi giờ ?
Tôi đoán bạn đang có múi giờ Ấn Độ ảnh hưởng đến mã của bạn. Chúng tôi thấy ở đây việc điều chỉnh theo Asia/Kolkata
múi giờ biểu hiện cùng thời gian trong ngày như bạn báo cáo, 08:55
tức là trước năm giờ rưỡi so với giá trị UTC của chúng tôi 03:25
.
2011-11-23T08: 55: 52.992 + 05: 30 [Châu Á / Kolkata]
Vùng mặc định
Bạn có thể áp dụng múi giờ mặc định hiện tại của JVM. Coi chừng mặc định có thể thay đổi bất cứ lúc nào trong thời gian chạy . Bất kỳ mã nào trong bất kỳ luồng nào của bất kỳ ứng dụng nào trong JVM đều có thể thay đổi mặc định hiện tại. Nếu quan trọng, hãy hỏi người dùng về múi giờ mong muốn / mong muốn của họ.
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Giới thiệu về java.time
Các java.time khung được xây dựng vào Java 8 và sau đó. Những lớp học thay thế cái cũ phiền hà di sản lớp học ngày thời gian như java.util.Date
, Calendar
, & SimpleDateFormat
.
Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên chuyển đổi sang các java.time lớp.
Để tìm hiểu thêm, xem Hướng dẫn Oracle . 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 .
Với trình điều khiển JDBC tuân thủ JDBC 4.2 trở lên, bạn có thể trao đổi trực tiếp các đối tượng java.time với cơ sở dữ liệu của mình. Không cần chuỗi hoặc java.sql. * Lớp.
Nơi để có được các lớp java.time?
Các ThreeTen-Extra dự án mở rộng 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 các bổ sung có thể trong tương lai cho java.time. Bạn có thể tìm thấy một số các lớp học hữu ích ở đây chẳng hạn như Interval
, YearWeek
, YearQuarter
, và nhiều hơn nữa .