2016-02-03 10 views
80

Mam zewnętrzne API zwracać mi daty jako long s, reprezentowane jako milisekundy od Epoki.Jak utworzyć lokalną datę Java 8 z długiego czasu Epoki w milisekundach?

Dzięki starym stylu Java API, chciałbym po prostu skonstruować Date od niego z

Date myDate = new Date(startDateLong)

Co to jest równoważne w Javie 8 za LocalDate/LocalDateTime klas?

Jestem zainteresowany przekształceniem punktu w czasie reprezentowanym przez długi na LocalDate w mojej aktualnej lokalnej strefie czasowej.

+4

Więc trzeba zacząć od pracy, co strefa czasowa dbasz o . Wartość "milisekund od epoki" zapewnia natychmiastowy moment, który może odnosić się do różnych dat w różnych strefach czasowych. Należy pamiętać, że 'java.util.Date' nigdy nie było tak naprawdę datą w sposób, w jaki' LocalDate' jest - również w czasie. –

+2

Sprawdź to pytanie: http://stackoverflow.com/questions/21242110/convert-java-util-date-to-java-time-localdate, które obejmuje konwersję 'java.util.Date' w' LocalDate' – hotzst

+1

Uwaga: Ten Q & A jest również cenny dla tych, którzy próbują przekonwertować 'File.lastModified()' (epoch millis) na 'LocalDate (Time)'. – kevinarpe

Odpowiedz

150

Jeśli masz milisekund od epoki i chcą konwertować je do lokalnego dniu z wykorzystaniem aktualnej lokalnej strefy czasowej, można użyć

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

ale pamiętaj, że nawet domyślna strefa czasowa systemu może się zmieniać, dlatego ta sama wartość long może dawać różne wyniki w kolejnych przebiegach, nawet na tym samym komputerze.

Ponadto należy pamiętać, że LocalDate, w przeciwieństwie do java.util.Date, naprawdę przedstawia datę, a nie datę i godzinę.

W przeciwnym razie, można użyć LocalDateTime:

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

+1 ode mnie po więcej szczegółowych wyjaśnień. Nawiasem mówiąc, nawet strefa niesystemowa może się zmienić (przez narzędzie tzupdater lub przez jdk-change), a zatem daje różne wyniki przed i po. –

+1

@Meno Hochschild: Nie koncentrowałem się na kodowanych strefach czasowych, ale raczej w porównaniu ze strefami czasowymi określonymi przez użytkownika, odczytywanymi z pliku konfiguracyjnego lub zmiennych środowiskowych, gdzie programista w naturalny sposób zakłada, że ​​może się zmieniać. Zakodowane w czasie strefy czasowe są w istocie podobne do domyślnych ustawień systemu; programista jest skory do myślenia, że ​​nigdy się nie zmieniają ... – Holger

15

Możesz zacząć Instant.ofEpochMilli(long):

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

+1 za wyraźne informowanie o strefie czasowej. Jeśli zostanie pominięty, bieżąca domyślna strefa czasowa maszyny JVM zostanie domyślnie zastosowana podczas określania daty. W danym momencie data zmienia się na całym świecie według strefy czasowej, ponieważ nowy dzień wschodzi wcześniej na wschodzie. –

0

stref czasowych i rzeczy na bok, to bardzo prosta alternatywa new Date(startDateLong) może być LocalDate.ofEpochDay(startDateLong/86400000L)

+3

Myślę, że powinieneś przynajmniej wyjaśnić, co oznacza 86400000L. – BAER

+1

Myślałem, że bardzo łatwo zauważyć, że jest to liczba milisekund w ciągu dnia. –

+2

Dla niektórych jest, i doszedłem do wniosku, że tylko to ma sens, ale bez ponownego obliczenia, ile MS dziennie naprawdę ma, nie byłbym pewien. Mówię tylko dla siebie, nie znam tej liczby tak dobrze, że automatycznie wiem, co ona oznacza. – BAER

Powiązane problemy