tl; dr
java.time.Instant // Represent a moment as seen in UTC. Internally, a count of nanoseconds since 1970-01-01T00:00Z.
.ofEpochSecond( 1_220_227_200L ) // Pass a count of whole seconds since the same epoch reference of 1970-01-01T00:00Z.
Kennen Sie Ihre Daten
Menschen verwenden seit einer Epoche verschiedene Präzisionen, um die Zeit als Zahl zu verfolgen . Wenn Sie also einige Zahlen erhalten, die seit einer Epoche als Zählung interpretiert werden sollen, müssen Sie Folgendes bestimmen:
- Welche Epoche?
Viele Epochendaten wurden in verschiedenen Systemen verwendet. Am häufigsten wird die POSIX / Unix-Zeit verwendet , bei der die Epoche der erste Moment des Jahres 1970 in UTC ist. Aber Sie sollten diese Epoche nicht annehmen .
- Welche Präzision?
Sprechen wir seit der Epoche über Sekunden, Millisekunden , Mikrosekunden oder Nanosekunden ?
- Welche Zeitzone?
Normalerweise hat eine Zählung seit der Epoche in der UTC / GMT-Zeitzone, dh sie hat überhaupt keinen Zeitzonenversatz. Aber manchmal, wenn unerfahrene oder datumsunabhängige Programmierer involviert sind, kann es eine implizite Zeitzone geben.
In Ihrem Fall scheinen Ihnen, wie andere angemerkt haben, Sekunden seit der Unix-Epoche gegeben worden zu sein. Sie übergeben diese Sekunden jedoch an einen Konstruktor, der Millisekunden erwartet. Die Lösung besteht also darin, mit 1.000 zu multiplizieren.
Gewonnene Erkenntnisse:
- Bestimmen Sie nicht die Bedeutung der empfangenen Daten.
- Lesen Sie das Dokument .
Deine Daten
Ihre Daten scheinen in ganzen Sekunden zu sein. Wenn wir eine Epoche von Anfang 1970 annehmen und wenn wir eine UTC-Zeitzone annehmen, dann 1,220,227,200
ist dies der erste Moment des ersten Tages im September 2008.
Joda-Zeit
Die mit Java gebündelten Klassen java.util.Date und .Calendar sind notorisch problematisch. Vermeide sie. Verwenden Sie stattdessen entweder die Joda-Time- Bibliothek oder das neue Java.time-Paket, das in Java 8 enthalten ist (und von Joda-Time inspiriert wurde).
Beachten Sie, dass a DateTime
in Joda-Time im Gegensatz zu juDate seine eigene zugewiesene Zeitzone wirklich kennt . Beachten Sie im folgenden Beispielcode für Joda-Time 2.4, dass wir zuerst die Millisekunden unter Verwendung der Standardannahme von UTC analysieren. Zweitens weisen wir eine Zeitzone von Paris zu, um sie anzupassen. Gleicher Moment in der Zeitleiste des Universums, aber andere Wanduhrzeit . Zur Demonstration stellen wir uns erneut auf UTC ein. Es ist fast immer besser, die gewünschte / erwartete Zeitzone explizit anzugeben, als sich auf einen impliziten Standard zu verlassen (häufig die Ursache für Probleme bei der Arbeit mit Datum und Uhrzeit).
Wir brauchen Millisekunden, um eine DateTime zu erstellen. Nehmen Sie also Ihre Eingabe von Sekunden und multiplizieren Sie mit tausend. Beachten Sie, dass das Ergebnis ein 64-Bit sein muss, long
da wir ein 32-Bit überlaufen würden int
.
long input = 1_220_227_200L; // Note the "L" appended to long integer literals.
long milliseconds = ( input * 1_000L ); // Use a "long", not the usual "int". Note the appended "L".
Geben Sie diese Anzahl von Millisekunden an den Konstruktor weiter. Dieser spezielle Konstruktor geht davon aus, dass die Anzahl aus der Unix-Epoche von 1970 stammt. Passen Sie die Zeitzone nach der Konstruktion wie gewünscht an.
Verwenden Sie die richtigen Zeitzonennamen , eine Kombination aus Kontinent und Stadt / Region. Verwenden Sie niemals 3- oder 4-Buchstaben-Codes, EST
da diese weder standardisiert noch eindeutig sind.
DateTime dateTimeParis = new DateTime( milliseconds ).withZone( DateTimeZone.forID( "Europe/Paris" ) );
Passen Sie zur Demonstration die Zeitzone erneut an.
DateTime dateTimeUtc = dateTimeParis.withZone( DateTimeZone.UTC );
DateTime dateTimeMontréal = dateTimeParis.withZone( DateTimeZone.forID( "America/Montreal" ) );
Zur Konsole werfen. Beachten Sie, wie unterschiedlich das Datum in Montréal ist, da der neue Tag in Europa begonnen hat, aber noch nicht in Amerika.
System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeUTC: " + dateTimeUtc );
System.out.println( "dateTimeMontréal: " + dateTimeMontréal );
Beim Ausführen.
dateTimeParis: 2008-09-01T02:00:00.000+02:00
dateTimeUTC: 2008-09-01T00:00:00.000Z
dateTimeMontréal: 2008-08-31T20:00:00.000-04:00
java.time
Die Macher von Joda-Time haben uns gebeten, so bald wie möglich auf den Ersatz, das java.time- Framework , umzusteigen . Während Joda-Time weiterhin aktiv unterstützt wird, werden alle zukünftigen Entwicklungen für die java.time-Klassen und ihre Erweiterungen im ThreeTen-Extra-Projekt durchgeführt.
Das Java-Time-Framework wird von JSR 310 definiert und in Java 8 und höher integriert. Die java.time-Klassen wurden im ThreeTen-Backport- Projekt auf Java 6 und 7 und im ThreeTenABP- Projekt auf Android zurückportiert .
An Instant
ist ein Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden. Seine Epoche ist der erste Moment des Jahres 1970 in UTC.
Instant instant = Instant.ofEpochSecond( 1_220_227_200L );
Wenden Sie einen Versatz von UTC ZoneOffset
an, um eine zu erhalten OffsetDateTime
.
Besser noch, wenn bekannt, wenden Sie eine Zeitzone ZoneId
an, um eine zu erhalten ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );