tl; dr
… Geparst… aus einem String… Zeitzone ist nicht angegeben… Ich möchte eine bestimmte Zeitzone festlegen
LocalDateTime.parse( "2018-01-23T01:23:45.123456789" ) // Parse string, lacking an offset-from-UTC and lacking a time zone, as a `LocalDateTime`.
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Assign the time zone for which you are certain this date-time was intended. Instantiates a `ZonedDateTime` object.
Keine Zeitzone in juDate
Wie in den anderen richtigen Antworten angegeben, hat ein java.util.Date keine Zeitzone † . Es repräsentiert UTC / GMT (kein Zeitzonenversatz). Sehr verwirrend, weil estoString
Methode beim Generieren einer String-Darstellung die Standardzeitzone der JVM anwendet.
Vermeiden Sie juDate
Aus diesem und vielen anderen Gründen sollten Sie die Verwendung von java.util.Date & .Calendar & java.text.SimpleDateFormat vermeiden. Sie sind notorisch lästig.
Verwenden Sie stattdessen das mit Java 8 gelieferte Paket java.time .
java.time
Die java.time-Klassen können einen Moment auf der Timeline auf drei Arten darstellen:
- UTC (
Instant
)
- Mit einem Offset (
OffsetDateTime
mit ZoneOffset
)
- Mit einer Zeitzone (
ZonedDateTime
mit ZoneId
)
Instant
In java.time ist der Grundbaustein Instant
ein Moment auf der Zeitachse in UTC. Verwenden Sie Instant
Objekte für einen Großteil Ihrer Geschäftslogik.
Instant instant = Instant.now();
OffsetDateTime
Tragen Sie eine Offset-von-UTC einzustellen in einige der Ortschaft Wandtaktzeit .
Bewerben Sie sich ZoneOffset
, um eine zu erhalten OffsetDateTime
.
ZoneOffset zoneOffset = ZoneOffset.of( "-04:00" );
OffsetDateTime odt = OffsetDateTime.ofInstant( instant , zoneOffset );
ZonedDateTime
Besser ist es, eine Zeitzone , einen Versatz sowie die Regeln für den Umgang mit Anomalien wie Sommerzeit (DST) anzuwenden .
Wenden Sie ein ZoneId
auf ein Instant
an, um ein zu erhalten ZonedDateTime
. Geben Sie immer einen richtigen Zeitzonennamen an . Verwenden Sie niemals 3-4 Abkürzungen wie EST
oder IST
, die weder eindeutig noch standardisiert sind.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
LocalDateTime
Wenn der Eingabezeichenfolge ein Indikator für Versatz oder Zone fehlte, analysieren Sie als LocalDateTime
.
Wenn Sie sich der beabsichtigten Zeitzone sicher sind, weisen Sie a ZoneId
zu , um a zu erzeugen ZonedDateTime
. Siehe Codebeispiel oben im Abschnitt tl; dr oben.
Formatierte Zeichenfolgen
Rufen Sie die toString
Methode für eine dieser drei Klassen auf, um eine Zeichenfolge zu generieren, die den Datums- / Uhrzeitwert im Standardformat ISO 8601 darstellt . Die ZonedDateTime
Klasse erweitert das Standardformat, indem der Name der Zeitzone in Klammern angehängt wird.
String outputInstant = instant.toString(); // Ex: 2011-12-03T10:15:30Z
String outputOdt = odt.toString(); // Ex: 2007-12-03T10:15:30+01:00
String outputZdt = zdt.toString(); // Ex: 2007-12-03T10:15:30+01:00[Europe/Paris]
Verwenden Sie für andere Formate die DateTimeFormatter
Klasse. Im Allgemeinen ist es am besten, diese Klasse lokalisierte Formate unter Verwendung der vom Benutzer erwarteten menschlichen Sprache und kulturellen Normen generieren zu lassen. Oder Sie können ein bestimmtes Format angeben.
Ü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
.
Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration auf java.time Klassen .
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
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.
Woher bekomme ich die java.time-Klassen?
Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden Interval
, YearWeek
, YearQuarter
, und mehr .
Joda-Zeit
Während Joda-Time noch aktiv gepflegt wird, haben uns die Macher angewiesen, so schnell wie möglich auf java.time zu migrieren. Ich lasse diesen Abschnitt als Referenz intakt, schlage aber vor, die zu verwendenjava.time
obigen Abschnitt zu verwenden.
In Joda-TimeDateTime
kennt ein Datums- / Uhrzeitobjekt ( ) seine zugewiesene Zeitzone wirklich. Dies bedeutet einen Versatz von UTC und den Regeln und dem Verlauf der Sommerzeit (DST) dieser Zeitzone und anderer solcher Anomalien.
String input = "2014-01-02T03:04:05";
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Kolkata" );
DateTime dateTimeIndia = new DateTime( input, timeZone );
DateTime dateTimeUtcGmt = dateTimeIndia.withZone( DateTimeZone.UTC );
Rufen Sie die toString
Methode auf, um einen String im ISO 8601- Format zu generieren .
String output = dateTimeIndia.toString();
Joda-Time bietet außerdem umfangreiche Funktionen zum Generieren aller Arten anderer String-Formate.
Bei Bedarf können Sie von Joda-Time DateTime in ein java.util.Date konvertieren.
Java.util.Date date = dateTimeIndia.toDate();
Durchsuchen Sie StackOverflow nach "joda date", um viele weitere Beispiele zu finden, von denen einige recht detailliert sind.
† Tatsächlich ist in einer java.util.Date eine Zeitzone eingebettet, die für einige interne Funktionen verwendet wird (siehe Kommentare zu dieser Antwort). Diese interne Zeitzone ist jedoch nicht als Eigenschaft verfügbar und kann nicht festgelegt werden. Diese interne Zeitzone ist nicht die, durch die verwendete toString
Methode in einer String - Darstellung des Datum-Zeit - Wert zu erzeugen; Stattdessen wird die aktuelle Standardzeitzone der JVM im laufenden Betrieb angewendet. Als Abkürzung sagen wir oft „juDate hat keine Zeitzone“. Verwirrend? Ja. Ein weiterer Grund, diese müden alten Klassen zu meiden.