2009-02-11 22 views
57

Mam ciąg znaków zawierający UNIX Epoch time i muszę go przekonwertować na obiekt Java Data.Czas epoki Unix do Java Data obiektu

String date = "1081157732"; 
DateFormat df = new SimpleDateFormat(""); // This line 
try { 
    Date expiry = df.parse(date); 
} catch (ParseException ex) { 
    ex.getStackTrace(); 
} 

Zaznaczona linia to miejsce, w którym mam problem. Nie mogę stwierdzić, jaki powinien być argument do SimpleDateFormat(), a nawet czy powinienem używać SimpleDateFormat().

+0

See [moja szczegółowa odpowiedź] (http://stackoverflow.com/a/20370992/642706) z podobnym pytaniem na konwersję pomiędzy milisekundach do daty i czasu z przykładowym kodem przy użyciu biblioteki Joda-Time. –

Odpowiedz

85

Jak o właśnie:

Date expiry = new Date(Long.parseLong(date)); 

EDIT: jak za rde6173 „s odpowiedź i przyjrzeć się bliżej na wejściu wskazanym w pytaniu pojawia się«1081157732»być epoka sekund oparte wartość tak, że chcesz pomnożyć długo z parseLong() przy 1000 do konwertowania do milisekund, co jest, co używa Data konstruktor Java, więc:

Date expiry = new Date(Long.parseLong(date) * 1000); 
+4

Czy nie byłoby to technicznie niepoprawne, ponieważ nie uwzględnia sekund przestępnych? –

+0

Tak po * 1000L, działa. –

+1

Maciej, "oparta na sekundach" epoka op zawiera już sekundy przestępne, jest to "sekunda". Tak więc ta odpowiedź jest poprawna. – thecarpy

5
long timestamp = Long.parseLong(date) 
Date expiry = new Date(timestamp * 1000) 
0

Hum .... jeśli nie jestem pomylić n, czas UNIX Epoki jest właściwie to samo, co

System.currentTimeMillis() 

Więc pisanie

try { 
    Date expiry = new Date(Long.parseLong(date)); 
} 
catch(NumberFormatException e) { 
    // ... 
} 

powinien działać (i znacznie szybciej tą datą parsowania)

+2

Zwykle czas epoki Unix jest mierzony w sekundach, a nie w milisekundach. –

33

Epoch jest liczbą sekund od 1 stycznia 1970 r ..

Więc:

String epochString = "1081157732"; 
long epoch = Long.parseLong(epochString); 
Date expiry = new Date(epoch * 1000); 

Aby uzyskać więcej informacji: http://www.epochconverter.com/

+1

To działa przyjemność ... IDK Y nie zostało to zaznaczone jako odpowiedź :) – Makky

+0

Dziękuję za tę odpowiedź. Siedziałem tutaj, próbując stworzyć datę z epoki, a wynik zawsze był jakiś dzień w 1970 roku, a to dlatego, że nieświadomie dawałem Java milisekundy, a nie sekundy :) –

0

jeszcze lepiej wykorzystać JodaTime. Znacznie łatwiej parsować łańcuchy i łańcuchy. Jest również bezpieczny dla wątków. Warto poświęcić czas, aby go wdrożyć.

0

Aby przekonwertować znacznik czasu sekund na milisekundę. Możesz użyć API TimeUnit i schludnie w ten sposób.

long milliSecondTimeStamp = MILLISECONDS.convert(secondsTimeStamp, SECONDS)

12

java.time

Używanie java.time ramy wbudowany w Java 8 i późniejszych.

import java.time.LocalDateTime; 
import java.time.Instant; 
import java.time.ZoneId; 

long epoch = Long.parseLong("1081157732"); 
Instant instant = Instant.ofEpochSecond(epoch); 
ZonedDateTime.ofInstant(instant, ZoneOffset.UTC); # ZonedDateTime = 2004-04-05T09:35:32Z[UTC] 

W tym przypadku należy lepiej wykorzystać ZonedDateTime aby oznaczyć ją jako datę w UTC strefy czasowej, bo Epoki jest zdefiniowana w UTC w Unix time używane przez Java.

ZoneOffset zawiera poręczną stałą dla strefy czasowej UTC, jak widać w ostatnim wierszu powyżej. Jego nadklasa, ZoneId może być wykorzystana do dostosowania się do innych stref czasowych.

ZoneId zoneId = ZoneId.of("America/Montreal"); 
+0

Dobra odpowiedź. Sugerowałbym upuszczenie 'LocalDateTime' i pokazanie' ZonedDateTime'. W większości aplikacji biznesowych najlepszym rozwiązaniem jest 'ZonedDateTime'. Ludzie często wpadają w kłopoty/zamieszanie z typami "LocalXXX". –

+0

Masz rację, zmieniłem to. – Przemek