Unix-Epochenzeit zum Java-Datumsobjekt

83

Ich habe eine Zeichenfolge, die die UNIX-Epochenzeit enthält , und ich muss sie in ein Java-Datumsobjekt konvertieren.

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

Die markierte Linie ist, wo ich Probleme habe. Ich kann nicht herausfinden, wie das Argument für SimpleDateFormat () lauten soll oder ob ich SimpleDateFormat () verwenden soll.

Xenph Yan
quelle
Siehe meine ausführliche Antwort auf eine ähnliche Frage zum Konvertieren zwischen Millisekunden und Datum / Uhrzeit mit Beispielcode unter Verwendung der Joda-Time-Bibliothek.
Basil Bourque
private String getDateString(long timeInMilliseconds) { SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy 'at' HH:mm:ss z"); return formatter.format(timeInMilliseconds); }
JVJplus

Antworten:

124

Wie wäre es einfach:

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

BEARBEITEN : Gemäß der Antwort von rde6173 und bei näherer Betrachtung der in der Frage angegebenen Eingabe scheint "1081157732" ein sekundenbasierter Epochenwert zu sein. Sie möchten also die Länge von parseLong () mit 1000 multiplizieren, um sie zu konvertieren in Millisekunden, was der Date-Konstruktor von Java verwendet, also:

Date expiry = new Date(Long.parseLong(date) * 1000);
Marc Novakowski
quelle
4
Wäre dies nicht technisch falsch, da Schaltsekunden nicht berücksichtigt werden?
Maciej Piechotka
1
Maciej, die "Sekunden-basierte" Epoche von op, macht bereits Schaltsekunden aus, sie basiert auf "Sekunden". Diese Antwort ist also richtig.
Thecarpy
1
Es gibt mir falsche Werte, wenn es mit 1000 multipliziert wird. Gibt es keinen besseren Weg, dies zu tun?
Ishaan
1
Zu Ihrer Information, die furchtbar lästig alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatsind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 und höher. Siehe Tutorial von Oracle .
Basil Bourque
Die Frage war seit der Epoche, die UTC ist, während das Datum erwartet, dass die lange von GMT kommt, sind sie gleich?
Luke
36

Epoche ist die Anzahl der Sekunden seit dem 1. Januar 1970.

So:

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

Für weitere Informationen: http://www.epochconverter.com/

Ryan Emerle
quelle
1
Dies funktioniert ein Vergnügen ... IDK Y dies wurde nicht als Antwort überprüft :)
Makky
Vielen Dank für diese Antwort. Ich saß hier und versuchte, ein Datum aus einer Epoche zu instanziieren, und das Ergebnis war immer eines Tages im Jahr 1970, und das lag daran, dass ich unwissentlich Java-Millisekunden und keine Sekunden gab :)
Lo-Tan
23

java.time

Verwenden des java.timein Java 8 und höher integrierten Frameworks.

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]

In diesem Fall sollten Sie es besser ZonedDateTimeals Datum in der UTC- Zeitzone markieren , da Epoche in UTC in der von Java verwendeten Unix-Zeit definiert ist .

ZoneOffsetenthält eine praktische Konstante für die UTC-Zeitzone, wie in der letzten Zeile oben gezeigt. Die Superklasse ZoneIdkann zur Anpassung an andere Zeitzonen verwendet werden.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
Przemek
quelle
Gute Antwort. Ich würde vorschlagen, das fallen zu lassen LocalDateTimeund nur ein zu zeigen ZonedDateTime. In den meisten Geschäftsanwendungen ZonedDateTimeist dies der beste Weg. Menschen neigen dazu, sich in Schwierigkeiten / Verwirrung mit den LocalXXXTypen zu bringen.
Basil Bourque
7
long timestamp = Long.parseLong(date)
Date expiry = new Date(timestamp * 1000)
tcurdt
quelle
0

Konvertieren des Sekundenzeitstempels in einen Millisekundenzeitstempel. Sie können die TimeUnit-API verwenden und so ordentlich.

long milliSecondTimeStamp = MILLISECONDS.convert(secondsTimeStamp, SECONDS)

Dinesh Jayabalan
quelle
-1

Hum ... wenn ich mich nicht irre, ist die Zeit der UNIX-Epoche tatsächlich dieselbe wie

System.currentTimeMillis()

Also schreibe

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

sollte funktionieren (und das Parsen des Datums viel schneller sein)

Varkhan
quelle
4
Normalerweise wird die Unix-Epochenzeit in Sekunden und nicht in Millisekunden gemessen.
Simon Nickerson