JSR 310 :: System.currentTimeMillis() vs Sofortige.toEpochMilli() :: TimeZone
Könnten Sie bitte etwas Licht auf, wie eine entsprechende Epoche Zeit in Millisekunden, für ein Standard-system-Zeitzone und die angegebene Zeitzone.
Gegeben
1. Zeitzone: GMT+3
2. Der folgende code-Schnipsel:
import java.time.*;
public class Main {
public static void main(String[] args) {
System.out.println(LocalDateTime
.now()
.atZone(ZoneOffset.UTC)
.toInstant()
.toEpochMilli()
);
System.out.println(LocalDateTime
.now()
.atZone(ZoneOffset.of("+3"))
.toInstant()
.toEpochMilli()
);
System.out.println(System.currentTimeMillis());
}
}
3. Ausgabe:
1444158955508
1444148155508
1444148155508
4. JavaDoc für System.currentTimeMillis(), die sagt, dass der zurückgegebene Wert die Differenz, gemessen in Millisekunden zwischen der aktuellen Zeit und Mitternacht 1. Januar 1970 UTC.
So, warum
- die Ausgabe der
LocalDateTime
beiGMT+3
ist der gleiche wie derSystem.currentTimeMillis()
, obwohl die docs für dieSystem.currentTimeMillis()
erwähnenUTC
? - die Ausgabe der
LocalDateTime
beiUTC
unterscheidet sich vonSystem.currentTimeMillis()
, obwohl die docs für dieSystem.currentTimeMillis()
erwähnenUTC
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beide
System.currentTimeMillis()
undInstant.toEpochMilli()
Gegenzug die Anzahl der Millisekunden seit der Unix-Epoche. Das ist nicht "in" einer bestimmten Zeit-zone, obwohl der Unix-Epoche eingestellt ist, normalerweise ausgedrückt als "Mitternacht am 1. Januar 1970, UTC". Nur einen Augenblick nur einen Augenblick in der Zeit, und ist die gleiche, egal welche Zeitzone du bist - aber es spiegelt eine andere lokale Zeit.Die Ausgabe von
LocalDateTime.atZone(UTC)
unterscheidet sich, weil Sie sagen, "Nehmen Sie das lokale Datum und die lokale Zeit, und konvertieren Sie Sie in eine instant -, als ob es in der UTC-Zeitzone" - auch wenn SieLocalDateTime
hast du ja implizit in der GMT+3 Zeitzone... das ist der Grund, warum es "falsch" ist.LocalDateTime.now()
nimmt das lokale Datum und die lokale Zeit in das system die default-Zeitzone. Also, wenn Sie Ihre Zeitzone ist UTC+3, den aktuellen Augenblick in der Zeit ist 2015-10-06T16:57:00Z, dannLocalDateTime.now()
zurück.2015-10-06T19:57:00
. Nennen wir daslocalNow
...So
localNow.atZone(ZoneOffset.of("+3"))
zurückZonedDateTime
vertreten 2015-10-06T19:57:00+03 - in anderen Worten, die gleichen lokale Datum - /Uhrzeit, aber "wissen", dass es 3 Stunden vor der UTC... alsotoInstant()
zurückInstant
vertreten 2015-10-06T16:57:00Z. Toll - wir haben noch das aktuelle Datum/Zeit.Aber
localNow.atZone(ZoneOffset.UTC)
zurückZonedDateTime
vertreten 2015-10-06T19:57:00Z - in anderen Worten, die gleichen lokale Datum - /Uhrzeit, aber "denken", dass es bereits in UTC... alsotoInstant()
zurückInstant
vertreten 2015-10-06T19:57:00Z.. das ist nicht die aktuelle Zeit an alle (in drei Stunden).Kurze version:
Gibt es keine Möglichkeit zu berechnen
LocalDateTime -> Instant
ist, müssen Sie eine Zeitzone.Mit einem timezone erhalten Sie eine
ZonedDateTime
und berechnen könnenZonedDateTime -> Instant
Instant == System.currentTimeMillis()
wenn die Zeitzone des ZonedDateTime gleich das system die default-Zeitzone.Lange version:
LocalDateTime ist die Zeit auf Ihrer Uhr(plus aktuelle Informationen). Das ist nicht genug, wenn du uns nicht sagst, welche Zeitzone Sie in. 13:00 Uhr in Tokio ist nicht das gleiche Instant-13:00 Uhr in Paris.
Einmal fügen Sie eine Zeitzone zu Ihrem LocalDateTime erhalten Sie eine ZonedDateTime und wir können nicht wissen, zu welchem Zeitpunkt Sie tatsächlich sind. E. g. sind Sie 13:00 Uhr in Tokio oder in Paris?
Um die richtigen Augenblick die Zeitzone des ZonedDateTime muss korrekt sein. Wenn es 13:00 Uhr in Tokyo, aber Sie behaupten, dass Sie 13:00 Uhr in Paris, erhalten Sie eine falsche Augenblick.
LocalDateTime:
ZonedDateTime:
Bekommen Instant Sie brauchen, um zu konvertieren LocalDateTime zu ZonedDateTime ersten. Wenn Sie dies korrekt gemacht haben(durch Angabe der korrekten Zeitzone) Ihre Instant-Stimmen-System.currentTimeMillis().
System.currentTimeMillis():
Wenn Sie Ihre Zeitzone ist GMT+3 dann ZonedDateTime.toInstant() geben Sie den richtigen Augenblick und Stimmen daher System.currentTimeMillis()
Wenn Sie Ihre Zeitzone ist nicht UTC dann ZonedDateTime.toInstant() geben Sie ein falsche Instant.