Wie extrahiere ich den Epochenwert Long
aus Instanzen von LocalDateTime
oder LocalDate
? Ich habe Folgendes versucht, aber es gibt mir andere Ergebnisse:
LocalDateTime time = LocalDateTime.parse("04.02.2014 19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
System.out.println(time.getLong(ChronoField.SECOND_OF_DAY)); // gives 71461
System.out.println(time.getLong(ChronoField.EPOCH_DAY)); // gives 16105
Was ich will, ist einfach der Wert 1391539861
für die lokale Datums- / Uhrzeitangabe "04.02.2014 19:51:01"
. Meine Zeitzone ist Europe/Oslo
UTC + 1 mit Sommerzeit.
LocalDateTime
anderen zu ermitteln, als sie manuell zu berechnen?Antworten:
Die Klassen
LocalDate
undLocalDateTime
enthalten keine Informationen über die Zeitzone oder den Zeitversatz sowie Sekunden seit der Epoche, die ohne diese Informationen nicht eindeutig wären. Die Objekte verfügen jedoch über mehrere Methoden, um sie durch Übergeben einerZoneId
Instanz in Datums- / Zeitobjekte mit Zeitzonen zu konvertieren .LocalDate
LocalDateTime
quelle
ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0))
long epoch = time.toEpochSecond(ZoneOffset.UTC)
für UTC-Fälle oderlong epoch = time.toEpochSecond(ZoneId.systemDefault());
wenn Sie die Zeitzone bereits kennen oder wenn Sie diesen Weg gehen möchten.Instant.ofEpochMilli(responseTime).atZone(ZoneId.systemDefault()).toLocalTime()
'Millis seit Unix-Epoche' stellt einen Augenblick dar, daher sollten Sie die Instant-Klasse verwenden:
quelle
ZoneId.systemDefault()
da sich die Unix-Epoche auf UTCDie Konvertierung, die Sie benötigen, erfordert den Offset von UTC / Greewich oder eine Zeitzone.
Wenn Sie einen Offset haben, gibt es eine spezielle Methode auf
LocalDateTime
für diese Aufgabe:Wenn Sie nur eine haben
ZoneId
, können Sie die erhaltenZoneOffset
vonZoneId
:Möglicherweise finden Sie die Konvertierung jedoch
ZonedDateTime
einfacher:quelle
long epochSec = localDateTime.toEpochSecond(ZoneOffset.UTC);
Sehen Sie sich diese Methode an, um festzustellen, welche Felder unterstützt werden. Sie finden für
LocalDateTime
:Das Feld INSTANT_SECONDS wird natürlich nicht unterstützt, da a
LocalDateTime
nicht auf einen absoluten (globalen) Zeitstempel verweisen kann. Hilfreich ist jedoch das Feld EPOCH_DAY, das die seit dem 01.01.1970 verstrichenen Tage zählt. Ähnliche Gedanken gelten für den TypLocalDate
(mit noch weniger unterstützten Feldern).Wenn Sie das nicht vorhandene Millis-Since-Unix-Epoch-Feld abrufen möchten, benötigen Sie auch die Zeitzone für die Konvertierung von einem lokalen in einen globalen Typ. Diese Konvertierung kann viel einfacher durchgeführt werden, siehe andere SO-Beiträge .
Zurück zu Ihrer Frage und den Zahlen in Ihrem Code:
16105L * 86400 + 71461 = 1391543461 Sekunden seit 1970-01-01T00: 00: 00 (Aufmerksamkeit, keine Zeitzone) Dann können Sie den Zeitzonenversatz subtrahieren (achten Sie auf mögliche Multiplikation mit 1000, wenn in Millisekunden).
UPDATE nach angegebenen Zeitzoneninformationen:
Als JSR-310-Code mit zwei äquivalenten Ansätzen:
quelle
LocalDateTime time = LocalDateTime.parse("04.02.2014 19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
und dannLong epoch = time.atZone(ZoneId.of("Europe/Oslo")).toEpochSecond();
.Vom vom Menschen lesbaren Datum in die Epoche konvertieren :
Von der Epoche zum lesbaren Datum konvertieren :
Für andere Sprachkonverter: https://www.epochconverter.com
quelle
Dies ist eine Möglichkeit, ohne Zeit und Zone zu verwenden:
quelle