425 Stimmen

Wie man Millisekunden von LocalDateTime in Java 8 erhält

Ich frage mich, ob es eine Möglichkeit gibt, die aktuellen Millisekunden seit dem 1.1.1970 (Epoch) mithilfe der neuen LocalDate, LocalTime oder LocalDateTime-Klassen von Java 8 zu erhalten.

Der bekannte Weg ist unten:

long currentMilliseconds = new Date().getTime();

oder

long currentMilliseconds = System.currentTimeMillis();

448voto

Stuart Marks Punkte 119555

Ich bin mir nicht ganz sicher, was du mit "aktuellen Millisekunden" meinst, aber ich nehme an, es handelt sich um die Anzahl der Millisekunden seit der "Epoch", nämlich Mitternacht, 1. Januar 1970 UTC.

Wenn du die Anzahl der Millisekunden seit der "Epoch" jetzt gerade finden möchtest, dann verwende System.currentTimeMillis(), wie Anubian Noob darauf hingewiesen hat. Falls ja, gibt es keinen Grund, eine der neuen java.time APIs dafür zu verwenden.

Vielleicht hast du jedoch bereits ein LocalDateTime oder ein ähnliches Objekt von irgendwo und möchtest es in Millisekunden seit der "Epoch" umwandeln. Das ist nicht direkt möglich, da die LocalDateTime-Objekte keine Vorstellung davon haben, in welcher Zeitzone sie sich befinden. Daher muss Zeitzone-Information angegeben werden, um die Zeit relativ zur "Epoch" zu finden, die in UTC ist.

Angenommen, du hast ein LocalDateTime wie folgt:

LocalDateTime ldt = LocalDateTime.of(2014, 5, 29, 18, 41, 16);

Du musst die Zeitzone-Information anwenden, um ein ZonedDateTime zu erhalten. Ich befinde mich in der gleichen Zeitzone wie Los Angeles, also würde ich etwas Ähnliches tun:

ZonedDateTime zdt = ldt.atZone(ZoneId.of("America/Los_Angeles"));

Natürlich basiert dies auf Annahmen über die Zeitzone. Und es gibt Randfälle, die auftreten können, zum Beispiel, wenn die lokale Zeit zufällig eine Zeit nahe dem Übergang zur Sommerzeit benennt. Lassen wir diese Fälle außer Acht, aber du solltest dir bewusst sein, dass sie existieren.

Wie auch immer, wenn du ein gültiges ZonedDateTime erhalten kannst, kannst du dies in die Anzahl der Millisekunden seit der "Epoch" umwandeln, wie folgt:

long millis = zdt.toInstant().toEpochMilli();

147voto

brian Punkte 10599

Was ich mache, damit ich keine Zeitzone angebe, ist,

System.out.println("ldt " + LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
System.out.println("ctm " + System.currentTimeMillis());

gibt

ldt 1424812121078 
ctm 1424812121281

Wie du sehen kannst, sind die Zahlen bis auf eine kurze Ausführungszeit gleich.

Falls du System.currentTimeMillis nicht magst, verwende Instant.now().toEpochMilli()

26voto

Marteng Punkte 1267

Seit Java 8 kannst du java.time.Instant.toEpochMilli() aufrufen.

Zum Beispiel der Aufruf

final long currentTimeJava8 = Instant.now().toEpochMilli();

liefert dir das gleiche Ergebnis wie

final long currentTimeJava1 = System.currentTimeMillis();

24voto

Dani Punkte 3621

Um ZoneId zu vermeiden, können Sie Folgendes tun:

LocalDateTime date = LocalDateTime.of(1970, 1, 1, 0, 0);

System.out.println("Ursprünglicher Epoch (Zeit in Millisekunden): " + date.toInstant(ZoneOffset.ofTotalSeconds(0)).toEpochMilli());

Den Wert 0 bekommen, das ist richtig!

15voto

Nalam Punkte 314

Sie können auch java.sql.Timestamp verwenden, um Millisekunden zu erhalten.

LocalDateTime now = LocalDateTime.now();
long milliSeconds = Timestamp.valueOf(now).getTime();
System.out.println("Millisekunden: "+milliSeconds);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X