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.


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);

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/


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" );

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)


0

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

long milliSecondTimeStamp = MILLISECONDS.convert(secondsTimeStamp, SECONDS)


-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)


4
Normalerweise wird die Unix-Epochenzeit in Sekunden und nicht in Millisekunden gemessen.
Simon Nickerson
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.