Ich habe Probleme mit der Date-Klasse in Java. Die Datumsklasse gibt das Datum des lokalen Computers zurück, aber ich benötige UTC-0.
Ich habe gegoogelt und eine großartige Lösung für JavaScript gefunden, aber für Java nichts Nützliches.
Wie bekomme ich UTC + 0 Datum in Java 8?
java.util.Date
ist niemals ein lokales Maschinendatum. Es wird seit 1970-01-01 relativ zu UTC + 00: 00 immer als verstrichene Millisekunden definiert. VielleichttoString()
verwirrt Sie das Verhalten seiner Methode , die tatsächlich eine Darstellung in der lokalen Zeitzone verwendet.Antworten:
Mit Java 8 können Sie schreiben:
Um Ihren Kommentar zu beantworten, können Sie ihn dann in ein Datum (es sei denn, Sie sind von Legacy-Code abhängig, ich sehe keinen Grund dafür) oder in Millis seit den Epochen konvertieren:
quelle
OffsetDateTime
alsZonedDateTime
vorausgesetzt, dass wir nur mit einem Versatz von UTC anstatt mit einer Vollzeitzone arbeiten?tl; dr
java.time
Die problematischen alten Datums- und Uhrzeitklassen , die mit den frühesten Versionen von Java gebündelt wurden, wurden durch die in Java 8 und höher integrierten java.time- Klassen ersetzt. Siehe Oracle Tutorial . Ein Großteil der Funktionen wurde in ThreeTen-Backport auf Java 6 & 7 zurückportiert und in ThreeTenABP weiter an Android angepasst .
Instant
An
Instant
repräsentiert einen Moment auf der Zeitachse in UTC mit einer Auflösung von bis zu Nanosekunden .Die
toString
Methode generiert ein String-Objekt mit Text, der den Datums- / Uhrzeitwert darstellt, unter Verwendung eines der Standardformate ISO 8601 .Die
Instant
Klasse ist eine grundlegende Bausteinklasse in java.time. Dies sollte Ihre erste Adresse beim Umgang mit Datum und Uhrzeit sein, da im Allgemeinen die beste Vorgehensweise darin besteht, Datums- und Uhrzeitwerte in UTC zu verfolgen, zu speichern und auszutauschen.OffsetDateTime
Es
Instant
gibt jedoch Einschränkungen, z. B. keine Formatierungsoptionen zum Generieren von Zeichenfolgen in alternativen Formaten. Konvertieren Sie für mehr Flexibilität vonInstant
nachOffsetDateTime
. Geben Sie einen Versatz von UTC an . In java.time bedeutet das einZoneOffset
Objekt. Hier wollen wir bei UTC (+00) bleiben, damit wir die bequeme Konstante verwenden könnenZoneOffset.UTC
.Oder überspringen Sie die
Instant
Klasse.Mit einem
OffsetDateTime
Objekt in der Hand können Sie jetztDateTimeFormatter
String-Objekte mit Text in alternativen Formaten erstellen. Durchsuchen Sie den Stapelüberlauf nach vielen AnwendungsbeispielenDateTimeFormatter
.ZonedDateTime
Wenn Sie anzeigen möchten , Wand-Uhr Zeit für einige bestimmte Zeitzone, gilt eine
ZoneId
eine zu bekommenZonedDateTime
.In diesem Beispiel wenden wir die Zeitzone Montréal an. Im Sommer hat die Zone unter dem Unsinn der Sommerzeit (DST) einen Versatz von
-04:00
. So Kenntnis , wie die Zeit-of-Tag vier Stunden zuvor in der Ausgabe,15
statt19
Stunden.Instant
undZonedDateTime
beide repräsentieren den gleichen gleichzeitigen Moment, nur durch zwei verschiedene Linsen betrachtet.Konvertieren
Während Sie die alten Datums- / Uhrzeitklassen vermeiden sollten, können Sie bei Bedarf mit neuen Methoden konvertieren, die zu den alten Klassen hinzugefügt wurden. Hier verwenden wir
java.util.Date.from( Instant )
undjava.util.Date::toInstant
.Und in die andere Richtung gehen.
Suchen Sie in ähnlicher Weise nach neuen Methoden, die zu
GregorianCalendar
(Unterklasse vonCalendar
) hinzugefügt wurden , um von und nach zu konvertierenjava.time.ZonedDateTime
.Über java.time
Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie
java.util.Date
,Calendar
, &SimpleDateFormat
.Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .
Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für
java.sql.*
Klassen. Hibernate 5 und JPA 2.2 unterstützen java.time .Woher bekomme ich die java.time-Klassen?
quelle
ZonedDateTime
wäre sie nicht erforderlich, da alleZoneId
auf eineZoneOffset
abgebildet würden, die wir nur verwenden könntenOffsetDateTime
.In Java8 würde ich die
Instant
Klasse verwenden, die sich bereits in UTC befindet und mit der man bequem arbeiten kann.Alternativ können Sie Folgendes verwenden:
Zurück zu
Instant
quelle
Instant
ist nicht zur Ortszeit. EinInstant
per Definition ist in UTC. Die in dieser Antwort gezeigten Machenschaften, die versuchen, in UTC zu gelangen, sind also nicht erforderlich. dieInstant
bereits ist in UTC. Weitere Informationen und viel einfacheren Code finden Sie in meiner Antwort .In Java8 verwenden Sie die neue Zeit-API und konvertieren einen Instant mithilfe der UTC-Zeitzone in eine ZonedDateTime
quelle
1-Zeilen-Lösung in Java 8:
quelle