tl; dr
java.time.Instant // Represent a moment as seen in UTC. Internally, a count of nanoseconds since 1970-01-01T00:00Z.
.ofEpochSecond( 1_220_227_200L ) // Pass a count of whole seconds since the same epoch reference of 1970-01-01T00:00Z.
Biết dữ liệu của bạn
Mọi người sử dụng các giới hạn khác nhau để theo dõi thời gian như một con số kể từ một kỷ nguyên . Vì vậy, khi bạn có được một số số được hiểu là số đếm kể từ một kỷ nguyên, bạn phải xác định:
- Kỷ nguyên nào?
Nhiều kỷ nguyên ngày đã được sử dụng trong các hệ thống khác nhau. Thường được sử dụng là thời gian POSIX / Unix , trong đó kỷ nguyên là thời điểm đầu tiên của năm 1970 theo giờ UTC. Nhưng bạn không nên cho rằng kỷ nguyên này.
- Độ chính xác nào?
Chúng ta đang nói chuyện giây, mili giây , micro giây hay nano giây kể từ kỷ nguyên?
- Múi giờ nào?
Thông thường, một số đếm vì kỷ nguyên nằm trong múi giờ UTC / GMT, tức là không có độ lệch múi giờ nào cả. Nhưng đôi khi, khi liên quan đến các lập trình viên thiếu kinh nghiệm hoặc thiếu hiểu biết về ngày giờ, có thể có một múi giờ ngụ ý.
Trong trường hợp của bạn, như những người khác đã lưu ý, bạn dường như đã có vài giây kể từ kỷ nguyên Unix. Nhưng bạn đang chuyển những giây đó cho một phương thức khởi tạo dự kiến là mili giây. Vì vậy, giải pháp là nhân với 1.000.
Bài học kinh nghiệm:
- Xác định, không giả định, ý nghĩa của dữ liệu nhận được.
- Đọc tài liệu .
Dữ liệu của bạn
Dữ liệu của bạn dường như chỉ trong vài giây. Nếu chúng ta giả sử một kỷ nguyên là đầu năm 1970 và nếu chúng ta giả định múi giờ UTC, thì đó 1,220,227,200
là thời điểm đầu tiên của ngày đầu tiên của tháng 9 năm 2008.
Joda-Time
Các lớp java.util.Date và .Calendar đi kèm với Java nổi tiếng là rắc rối. Tránh chúng. Thay vào đó, hãy sử dụng thư viện Joda-Time hoặc gói java.time mới được đóng gói trong Java 8 (và lấy cảm hứng từ Joda-Time).
Lưu ý rằng không giống như juDate, DateTime
trong Joda-Time thực sự biết múi giờ được chỉ định của chính nó . Vì vậy, trong ví dụ về mã Joda-Time 2.4 bên dưới, hãy lưu ý rằng trước tiên chúng tôi phân tích cú pháp mili giây bằng cách sử dụng giả định mặc định là UTC. Sau đó, thứ hai, chúng tôi chỉ định múi giờ của Paris để điều chỉnh. Cùng một thời điểm trong dòng thời gian của Vũ trụ, nhưng thời gian trên đồng hồ treo tường khác nhau . Để trình diễn, chúng tôi điều chỉnh lại thành UTC. Hầu như luôn luôn tốt hơn để chỉ định rõ ràng múi giờ mong muốn / dự kiến của bạn hơn là dựa vào một mặc định ngầm (thường là nguyên nhân gây ra rắc rối trong công việc hẹn giờ).
Chúng ta cần mili giây để tạo DateTime. Vì vậy, hãy lấy số giây đầu vào của bạn và nhân với một nghìn. Lưu ý rằng kết quả phải là 64-bit long
vì chúng ta sẽ làm tràn 32-bit int
.
long input = 1_220_227_200L; // Note the "L" appended to long integer literals.
long milliseconds = ( input * 1_000L ); // Use a "long", not the usual "int". Note the appended "L".
Cung cấp số mili giây đó cho hàm tạo. Phương thức khởi tạo cụ thể đó giả định số đếm là từ kỷ nguyên Unix năm 1970. Vì vậy, hãy điều chỉnh múi giờ như mong muốn, sau khi xây dựng.
Sử dụng tên múi giờ thích hợp , kết hợp giữa lục địa và thành phố / khu vực. Không bao giờ sử dụng mã 3 hoặc 4 chữ cái EST
vì chúng không được tiêu chuẩn hóa và không phải là duy nhất.
DateTime dateTimeParis = new DateTime( milliseconds ).withZone( DateTimeZone.forID( "Europe/Paris" ) );
Để trình diễn, hãy điều chỉnh lại múi giờ.
DateTime dateTimeUtc = dateTimeParis.withZone( DateTimeZone.UTC );
DateTime dateTimeMontréal = dateTimeParis.withZone( DateTimeZone.forID( "America/Montreal" ) );
Đổ vào bảng điều khiển. Lưu ý rằng ngày khác ở Montréal như thế nào, vì ngày mới đã bắt đầu ở châu Âu nhưng chưa ở Mỹ.
System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeUTC: " + dateTimeUtc );
System.out.println( "dateTimeMontréal: " + dateTimeMontréal );
Khi chạy.
dateTimeParis: 2008-09-01T02:00:00.000+02:00
dateTimeUTC: 2008-09-01T00:00:00.000Z
dateTimeMontréal: 2008-08-31T20:00:00.000-04:00
java.time
Các nhà sản xuất của Joda-Time đã yêu cầu chúng tôi chuyển sang phần mềm thay thế của nó, khuôn khổ java.time ngay khi thuận tiện. Trong khi Joda-Time tiếp tục được hỗ trợ tích cực, tất cả sự phát triển trong tương lai sẽ được thực hiện trên các lớp java.time và các phần mở rộng của chúng trong dự án ThreeTen-Extra.
Khung thời gian java được định nghĩa bởi JSR 310 và được tích hợp vào Java 8 trở lên. Các lớp java.time đã được chuyển ngược sang Java 6 & 7 trong dự án ThreeTen-Backport và cho Android trong dự án ThreeTenABP .
An Instant
là một thời điểm trên dòng thời gian tính theo giờ UTC với độ phân giải là nano giây. Kỷ nguyên của nó là thời điểm đầu tiên của năm 1970 theo giờ UTC.
Instant instant = Instant.ofEpochSecond( 1_220_227_200L );
Áp dụng giá trị chênh lệch từ UTC ZoneOffset
để nhận được OffsetDateTime
.
Tốt hơn, nếu biết, hãy áp dụng múi giờ ZoneId
để lấy a ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );