2016-02-03 19 views
80

Harici bir API'm var, Epoch'tan bu yana milisaniye olarak temsil edilen long s tarihleri.Milisaniye cinsinden uzun bir Epoch süresinden nasıl bir Java 8 LocalDate oluşturabilirim?

eski tarz Java API ile

, ben sadece

Date myDate = new Date(startDateLong)

Java 8'in LocalDate/LocalDateTime sınıflarında eşdeğer nedir ile ondan bir Date inşa edecek?

Geçerli yerel saat dilimimde, uzun süre temsil edilen zamanı LocalDate değerine dönüştürmekle ilgileniyorum.

+4

Eh, sizin için önemli ne zaman dilimini dışarı çalışarak başlamak zorunda olabilir . "Zamandan bu yana geçen milisaniye" değeri, size farklı zaman dilimlerindeki farklı tarihlere atıfta bulunabilecek bir zaman kazandırır. "Java.util.Date" in asla "LocalDate" şeklindeki bir tarih olmadığını aklından çıkarmayın - zaman içinde bir an oldu. –

+2

Bu soruyu kontrol edin: http://stackoverflow.com/questions/21242110/convert-java-util-date-to-java-time-localdate, java.util.Date öğesinin "LocalDate" 'e dönüştürülmesini kapsar – hotzst

+1

Not: Bu Q & A, File.lastModified() '(epoch millis) 'i LocalDate (Time)'' a dönüştürmeye çalışanlar için de değerlidir. Zaman dilimi hakkında açık olması için – kevinarpe

cevap

150

kullanabileceğiniz

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

ama Sistemin varsayılan zaman diliminin bile değişebileceğini unutmayın, dolayısıyla aynı makine üzerinde bile aynı long değeri sonraki çalışmalarda farklı sonuçlar verebilir. Ayrıca, java.util.Date'un aksine 'un tarih ve saati değil, bir tarihi temsil ettiğini unutmayın.

Aksi takdirde, bir LocalDateTime kullanabilirsiniz:

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

+1 benden. Bu arada, sistem dışı bir bölge bile (tzupdater-tool veya jdk-change) değişebilir ve bundan önce ve sonra farklı sonuçlar üretebilir. –

+1

@Meno Hochschild: Sabit kodlanmış saat dilimlerine odaklanmıyordum, aksine kullanıcı tarafından belirtilen zaman dilimlerini karşılaştırarak, programcının doğal olarak değişebileceğini varsaydığı bir yapılandırma dosyasından veya ortam değişkenlerinden okuyordum. Sabit kodlu zaman dilimleri gerçekten sistem varsayılanı gibidir; programcı hiç değişmediklerini düşünmeye başlıyor… – Holger

15

Sen Instant.ofEpochMilli(long) ile başlatabilirsiniz: Eğer Epoch'tan beri milisaniye olması ve mevcut yerel saat dilimini kullanarak yerel bir tarihe dönüştürmek istiyorsanız

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

+1. Gerekmiyorsa, JVM’nin geçerli varsayılan saat dilimi, tarihin belirlenmesinde örtülü olarak uygulanır. Herhangi bir an için tarih, dünyanın doğusundaki yeni bir günün başlangıcında zaman dilimine göre değişir. Daha detaylı açıklama için –

0

Saat dilimleri ve bir kenara şeyler, new Date(startDateLong) çok basit bir alternatif LocalDate.ofEpochDay(startDateLong/86400000L)

+3

En azından 86400000L'nin ne anlama geldiğini açıklamalısınız. – BAER

+1

Bir günde milisaniye sayısının fark edilmesinin çok kolay olduğunu düşündüm. –

+2

Bazıları için, sadece bunun mantıklı olacağını düşündüm, ama bir gün içinde kaç msn yeniden hesaplama yapılmaksızın emin olamayacağım. Sadece kendim için konuşuyorum, bu numarayı o kadar iyi bilmiyorum ki, ne olduğunu otomatik olarak bilirim. – BAER

İlgili konular