tl; dr
Instant.ofEpochSecond(1_220_227_200L)
biết dữ liệu của bạn
dân sử dụng độ chính xác khác nhau trong thời gian theo dõi như một số từ một epoch. Vì vậy, khi bạn nhận được một số số được hiểu là số đếm từ kỷ nguyên, bạn phải xác định:
- Kỷ nguyên gì?
Many epochs dates đã được sử dụng trong các hệ thống khác nhau. Thường được sử dụng là POSIX/Unix time, nơi kỷ nguyên là thời điểm đầu tiên của năm 1970 tại UTC. Nhưng bạn không nên giả sử thời đại này.
- Độ chính xác là gì?
Chúng ta đang nói giây, milliseconds, microseconds hoặc nanoseconds từ thời đại?
- Múi giờ nào?
Thông thường, tính từ thời điểm epoch nằm trong múi giờ UTC/GMT, nghĩa là không có chênh lệch múi giờ. Nhưng đôi khi, khi liên quan đến các lập trình viên thiếu kinh nghiệm hoặc không biết ngày, 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 ý, có vẻ như bạn đã nhận được vài giây từ kỷ nguyên Unix. Nhưng bạn đang truyền những giây đó cho một nhà xây dựng 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, đừng cho rằng, ý nghĩa của dữ liệu nhận được.
- Đọc the doc.
liệu
Dữ liệu của bạn của bạn có vẻ là toàn bộ giây. Nếu chúng ta giả định một kỷ nguyên của sự khởi đầu của năm 1970, và nếu chúng ta giả định múi giờ UTC, sau đó 1,220,227,200
là giây phút đầu tiên của ngày đầu tiên của tháng Chín năm 2008.
Joda thời gian
Các java.util.Date và các lớp .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 java.time package mới trong Java 8 (và được lấy cảm hứng từ Joda-Time).
Lưu ý rằng không giống như j.u.Date, DateTime
trong Joda-Time thực sự biết được chỉ định riêng time zone. Vì vậy, trong ví dụ mã Joda-Time 2.4 được thấy bên dưới, 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 của UTC. Sau đó, thứ hai, chúng tôi chỉ định múi giờ của Paris để điều chỉnh. Cùng thời điểm trong dòng thời gian của Vũ trụ, nhưng khác nhau wall-clock time. Để trình diễn, chúng tôi điều chỉnh lại, sang UTC. Hầu như luôn luôn tốt hơn để xác định rõ ràng múi giờ mong muốn/mong đợi của bạn hơn là dựa vào một mặc định ngầm định (thường là nguyên nhân của sự cố trong công việc ngày giờ).
Chúng tôi cần mili giây để tạo DateTime. Vì vậy, lấy đầu vào của bạn trong vài giây, và nhân với một ngàn. Lưu ý rằng kết quả phải là 6423 bit long
vì chúng tôi sẽ tràn một bit32 bit.
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".
Nạp số milli giây đó vào hàm tạo. Nhà xây dựng cụ thể đó giả định số đếm là từ kỷ nguyên Unix năm 1970. Vì vậy, điều chỉnh múi giờ như mong muốn, sau khi xây dựng.
Sử dụng proper time zone tên, kết hợp lục địa và thành phố/khu vực. Không bao giờ sử dụng 3 hoặc 4 mã thư như EST
vì chúng không được tiêu chuẩn hóa 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"));
Dump to console. Lưu ý cách ngày tháng khác ở Montréal, vì ngày mới bắt đầu ở châu Âu nhưng chưa bắt đầu ở 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 Joda thời gian đã yêu cầu chúng tôi chuyển sang thay thế của nó, khuôn khổ java.time càng sớm càng thuận tiện. Trong khi Joda-Time tiếp tục được hỗ trợ tích cực, tất cả các 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 xác định 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 về Java 6 & 7 trong dự án ThreeTen-Backport và Android trong dự án ThreeTenABP.
An Instant
là thời điểm 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à thời điểm đầu tiên của năm 1970 tại UTC.
Instant instant = Instant.ofEpochSecond(1_220_227_200L);
Áp dụng một offset-from-UTCZoneOffset
để có được một OffsetDateTime
.
Tốt hơn, nếu biết, hãy áp dụng múi giờ ZoneId
để nhận được ZonedDateTime
.
ZoneId zoneId = ZoneId.of("America/Montreal");
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant , zoneId);
Bạn có thể cho biết giá trị nào bạn mong đợi? Câu hỏi về giây/mili giây có thể là giá trị hợp lệ, nhưng 1220227200 không phải là 1/1/1970.Có vẻ như bạn đang truyền 0 cho hàm tạo. Một số mã khác có thể hữu ích. – SJuan76
@mmmiki - bạn nên chấp nhận câu trả lời – Stewart
nó trả về ngày 15 tháng 1 năm 1970, tại đây, không phải jan 1st. – njzk2