2016-02-03 24 views
80

Tôi có API bên ngoài trả lại cho tôi ngày là long s, được biểu thị bằng mili giây kể từ Epoch.Làm cách nào để tạo Java 8 LocalDate từ thời gian Epoch dài trong mili giây?

Với phong cách Java API cũ, tôi sẽ chỉ đơn giản là xây dựng một Date từ nó với

Date myDate = new Date(startDateLong)

tương đương trong Java 8 của LocalDate/LocalDateTime lớp là gì?

Tôi quan tâm đến việc chuyển đổi thời điểm được biểu thị bằng thời gian dài thành một số LocalDate trong múi giờ địa phương hiện tại của tôi.

+4

Vâng, bạn phải bắt đầu bằng cách làm việc ra những gì múi giờ mà bạn quan tâm . Giá trị "mili giây từ thời đại" cho bạn ngay lập tức ... có thể tham khảo các ngày khác nhau trong các múi giờ khác nhau. Hãy nhớ rằng 'java.util.Date' không bao giờ thực sự là một ngày theo cách mà' LocalDate' là - nó cũng là một thời điểm ngay lập tức. –

+2

Kiểm tra câu hỏi này: http://stackoverflow.com/questions/21242110/convert-java-util-date-to-java-time-localdate, bao gồm việc chuyển đổi 'java.util.Date' thành' LocalDate' – hotzst

+1

Lưu ý: Điều này cũng có giá trị đối với những người cố gắng chuyển đổi 'File.lastModified()' (epoch millis) thành 'LocalDate (Time)'. – kevinarpe

Trả lời

150

Nếu bạn có mili giây kể từ Epoch và muốn chuyển đổi chúng sang một ngày địa phương sử dụng các múi giờ địa phương hiện tại, bạn có thể sử dụng

LocalDate date = 
    Instant.ofEpochMilli(longValue).atZone(ZoneId.systemDefault()).toLocalDate(); 

nhưng hãy nhớ rằng ngay cả múi giờ mặc định của hệ thống cũng có thể thay đổi, do đó giá trị long giống nhau có thể tạo ra kết quả khác nhau trong các lần chạy tiếp theo, ngay cả trên cùng một máy.

Hơn nữa, hãy nhớ rằng LocalDate, không giống như java.util.Date, thực sự đại diện cho một ngày chứ không phải ngày và giờ.

Nếu không, bạn có thể sử dụng một LocalDateTime:

LocalDateTime date = 
    LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue), ZoneId.systemDefault()); 
+0

+1 từ tôi để được giải thích chi tiết hơn. Bằng cách này, ngay cả một khu vực không có hệ thống cũng có thể thay đổi (bằng công cụ tzupdater hoặc bằng jdk-change) và do đó tạo ra các kết quả khác nhau trước và sau. –

+1

@Meno Hochschild: Tôi không tập trung vào các múi giờ được mã hóa cứng mà là so sánh với múi giờ do người dùng chỉ định, đọc từ tệp cấu hình hoặc biến môi trường, nơi lập trình viên tự nhiên giả định rằng có thể thay đổi. Các múi giờ được mã hóa cứng thực sự giống như hệ thống mặc định; lập trình viên bị cám dỗ khi nghĩ rằng họ không bao giờ thay đổi ... – Holger

15

Bạn có thể bắt đầu với Instant.ofEpochMilli(long):

LocalDate date = 
    Instant.ofEpochMilli(startDateLong) 
    .atZone(ZoneId.systemDefault()) 
    .toLocalDate(); 
+1

+1 để rõ ràng về múi giờ. Nếu bị bỏ qua, múi giờ mặc định hiện tại của JVM sẽ được áp dụng ngầm định trong ngày xác định. Đối với bất kỳ thời điểm nào, ngày thay đổi trên toàn thế giới theo múi giờ như một ngày mới bắt đầu sớm hơn ở phía đông. –

0

múi giờ và các công cụ sang một bên, một lựa chọn rất đơn giản để new Date(startDateLong) có thể LocalDate.ofEpochDay(startDateLong/86400000L)

+3

Tôi nghĩ ít nhất bạn nên giải thích 86400000L là gì. – BAER

+1

Tôi nghĩ rất dễ nhận ra rằng đó là số mili giây trong một ngày. –

+2

Đối với một số nó là, và tôi figured rằng chỉ có mà sẽ có ý nghĩa, nhưng không tính toán lại bao nhiêu ms một ngày thực sự có, tôi sẽ không chắc chắn. Chỉ cần nói cho bản thân mình, tôi không biết số này tốt đến nỗi tôi tự động biết nó là gì. – BAER

Các vấn đề liên quan