Ich frage mich , ob es einen Weg gibt aktuelle Millisekunden seit 1970.01.01 (Epoche) mit dem neuen zu bekommen LocalDate
, LocalTime
oder LocalDateTime
Klassen von Java 8.
Der bekannte Weg ist unten:
long currentMilliseconds = new Date().getTime();
oder
long currentMilliseconds = System.currentTimeMillis();
System.currentTimeMillis()
?currentTimeMillis
das in diesem Zusammenhang irrelevant wäre. Denken Sie an Kalender + Wanduhr mit wirklich guter Präzision und ohne Bedenken hinsichtlich Zeitzonen und Ort. Es gibt also keine Möglichkeit, von einer LocalTimeAntworten:
Ich bin mir nicht ganz sicher, was Sie unter "aktuellen Millisekunden" verstehen, aber ich gehe davon aus, dass dies die Anzahl der Millisekunden seit der "Epoche" ist, nämlich Mitternacht, 1. Januar 1970 UTC.
Wenn Sie die Anzahl der Millisekunden seit der Epoche jetzt ermitteln möchten , verwenden Sie,
System.currentTimeMillis()
wie Anubian Noob hervorgehoben hat . In diesem Fall gibt es keinen Grund, eine der neuen java.time-APIs zu verwenden.Vielleicht haben Sie jedoch bereits ein
LocalDateTime
oder ein ähnliches Objekt von irgendwoher und möchten es seit der Epoche in Millisekunden konvertieren. Dies ist nicht direkt möglich, da dieLocalDateTime
Objektfamilie keine Ahnung hat, in welcher Zeitzone sie sich befinden. Daher müssen Zeitzoneninformationen bereitgestellt werden, um die Zeit relativ zur Epoche in UTC zu ermitteln.Angenommen, Sie haben Folgendes
LocalDateTime
:Sie müssen die Zeitzoneninformationen anwenden und a
ZonedDateTime
. Ich bin in der gleichen Zeitzone wie Los Angeles, also würde ich so etwas machen:Dies macht natürlich Annahmen über die Zeitzone. Und es gibt Randfälle, die auftreten können, wenn beispielsweise die Ortszeit eine Zeit in der Nähe des Übergangs Sommerzeit (Sommerzeit) benennt. Lassen Sie uns diese beiseite legen, aber Sie sollten sich bewusst sein, dass diese Fälle existieren.
Wie auch immer, wenn Sie eine gültige erhalten können
ZonedDateTime
, können Sie diese in die Anzahl der Millisekunden seit der Epoche umwandeln, wie folgt:quelle
getEpochSecond
Methode verfügt ( standardmäßig über ChronoZonedDateTime ). Keine Notwendigkeit für dieInstant
.zdt.toInstant().toEpochMilli();
dass Sie die Millisekunden für den entsprechenden UTC-Wert erhalten , nicht für Ihre Zonendatumszeit. Ich fand das auf die harte Tour.toInstant()
gibt Ihnen einen UTC-Augenblick. Wenn Sie die Ortszeit in Millis möchten, erhalten Sie nicht das, was Sie erwarten . Wenn Sie also z. B. eine Zeitzone von +02: 00 verwenden, beträgt Ihre zurückgegebene Zeit 3600 * 2 * 1000 Millisekunden weniger als erwartet.ZonedDateTime.now().toInstant().toEpochMilli()
,LocalDateTime.now().toInstant(OffsetDateTime.now().getOffset()).toEpochMilli()
,LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli()
,Calendar.getInstance().getTime().getTime()
,new Date().getTime()
undSystem.currentTimeMillis()
. Die einzige Methode, die "aus" zu sein scheint, ist die von Ihnen vorgeschlagene:LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli()
Gibt Ihnen die Millis für Ihr lokales Datum an, als wäre es ein UTC-Datum , dh wenn das lokale Datum UTC + 2 ist, gibt Ihre Methode Millis für 2 Stunden in der Zukunft an .Ich gebe keine Zeitzone an.
gibt
Wie Sie sehen können, sind die Zahlen bis auf eine kleine Ausführungszeit gleich.
Nur für den Fall, dass Sie System.currentTimeMillis nicht mögen, verwenden Sie
Instant.now().toEpochMilli()
quelle
Um ZoneId zu vermeiden, können Sie Folgendes tun:
0 als Wert bekommen, das ist richtig!
quelle
ZoneOffset.ofTotalSeconds(0)
es ist das gleiche wieZoneOffset.UTC
ZoneOffset
ist eine Unterklasse vonZoneId
, also würde ich nicht genau sagen, dass Sie es vermieden haben, aber solange Sie glücklich sind ...ZoneId
?Seit Java 8 können Sie anrufen
java.time.Instant.toEpochMilli()
.Zum Beispiel der Anruf
gibt Ihnen die gleichen Ergebnisse wie
quelle
Sie können
java.sql.Timestamp
auch Millisekunden abrufen.quelle
Timestamp
Klasse längst veraltet und voller Designprobleme, daher möchte ich sie lieber vermeiden, insbesondere wenn wir die Klassen vonjava.time
like verwenden könnenLocalDateTime
.Timestamp
, können Sie einen Artikel darüber teilen? Es hilft mir, die VerwendungTimestamp
meines Codes zu vermeiden . Vielen Dank!Date
, kann aber oft nicht als Unterklasse behandelt werdenDate
. Die meisten vonDate
und einem Konstruktor geerbten Methoden sind veraltet. DietoString
Methode verwendet die Zeitzone der JVM, die viele verwirrt, da dieselbeTimestamp
auf verschiedenen Computern unterschiedlich gedruckt wird ( Beispiel ).LocalDate.of(year, month, day)
Verwenden Sie, um die aktuelle Zeit in Millisekunden (seit der Epoche) abzurufen
System.currentTimeMillis()
.quelle
Wenn Sie eine Java 8-Uhr haben, können Sie diese verwenden
clock.millis()
(obwohl empfohlen wirdclock.instant()
, eine Java 8-Instanz zu verwenden, da diese genauer ist).Warum sollten Sie eine Java 8-Uhr verwenden? In Ihrem DI-Framework können Sie also eine Clock-Bean erstellen:
und dann können Sie es in Ihren Tests leicht verspotten:
oder Sie können eine andere Bohne haben:
Das hilft bei Tests, die Daten und Zeiten unermesslich bestätigen.
quelle
quelle
Warum hat niemand die Methode erwähnt
LocalDateTime.toEpochSecond()
:Dies scheint viel kürzer zu sein als viele der oben vorgeschlagenen Antworten ...
quelle
toEpochMilli
Methode gibt , wenn man bedenkt, dass man in LocalDateTime sogar Nanosekunden angeben kann: Es gibt eine MethodeLocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond)
.