tl; dr
Instant.now() // Capture the current moment in UTC.
Generieren Sie eine Zeichenfolge, um diesen Wert darzustellen:
Instant.now().toString()
2016-09-13T23: 30: 52.123Z
Einzelheiten
Wie die richtige Antwort von Jon Skeet feststellte, hat ein java.util.Date-Objekt keine Zeitzone † . Bei der toString
Implementierung wird jedoch die Standardzeitzone der JVM angewendet, wenn die Zeichenfolgendarstellung dieses Datums- / Uhrzeitwerts generiert wird. Für den naiven Programmierer verwirrend, scheint ein Datum eine Zeitzone zu haben, tut dies aber nicht.
Die java.util.Date
, j.u.Calendar
und java.text.SimpleDateFormat
Klassen mit Java gebündelt sind notorisch schwierig. Vermeide sie. Verwenden Sie stattdessen eine dieser kompetenten Datums- / Uhrzeitbibliotheken:
java.time (Java 8)
Java 8 enthält ein hervorragendes neues Paket java.time. * , Das die alten Klassen java.util.Date/Calendar ersetzt.
Das Abrufen der aktuellen Zeit in UTC / GMT ist ein einfacher Einzeiler…
Instant instant = Instant.now();
Diese Instant
Klasse ist der Grundbaustein in java.time und repräsentiert einen Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden .
In Java 8 wird der aktuelle Moment mit einer Auflösung von nur bis zu Millisekunden erfasst. Java 9 bietet eine neue Implementierung von Clock
Captures für den aktuellen Moment bis zur vollen Nanosekunden-Fähigkeit dieser Klasse, abhängig von der Fähigkeit der Clock-Hardware Ihres Host-Computers.
Die toString
Methode generiert eine String-Darstellung ihres Werts unter Verwendung eines bestimmten ISO 8601-Formats . Dieses Format gibt nach Bedarf null, drei, sechs oder neun Ziffern ( Millisekunden , Mikrosekunden oder Nanosekunden ) aus, um den Sekundenbruchteil darzustellen.
Wenn Sie eine flexiblere Formatierung oder andere zusätzliche Funktionen wünschen, wenden Sie einen Versatz von UTC von Null an, damit UTC selbst ( ZoneOffset.UTC
konstant ) a erhält OffsetDateTime
.
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );
Auf die Konsole werfen ...
System.out.println( "now.toString(): " + now );
Beim Laufen…
now.toString(): 2014-01-21T23:42:03.522Z
Ü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.
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
UPDATE: Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .
Mit der kostenlosen Open-Source-Bibliothek von Joda-Time von Drittanbietern können Sie die aktuelle Datums- und Uhrzeitangabe in nur einer Codezeile abrufen.
Joda-Time hat die neuen Klassen java.time. * In Java 8 inspiriert, hat aber eine andere Architektur. Sie können Joda-Time in älteren Java-Versionen verwenden. Joda-Time arbeitet weiterhin in Java 8 und wird weiterhin aktiv gewartet (Stand 2014). Das Joda-Time-Team empfiehlt jedoch die Migration zu java.time.
System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );
Detaillierterer Beispielcode (Joda-Time 2.3)…
org.joda.time.DateTime now = new org.joda.time.DateTime(); // Default time zone.
org.joda.time.DateTime zulu = now.toDateTime( org.joda.time.DateTimeZone.UTC );
Auf die Konsole werfen ...
System.out.println( "Local time in ISO 8601 format: " + now );
System.out.println( "Same moment in UTC (Zulu): " + zulu );
Beim Laufen…
Local time in ISO 8601 format: 2014-01-21T15:34:29.933-08:00
Same moment in UTC (Zulu): 2014-01-21T23:34:29.933Z
Weitere Beispiele für Code, der Zeitzonenarbeiten ausführt, finden Sie in meiner Antwort auf eine ähnliche Frage.
Zeitzone
Ich empfehle, immer eine Zeitzone anzugeben, anstatt sich implizit auf die aktuelle Standardzeitzone der JVM zu verlassen (die sich jederzeit ändern kann!). Ein solches Vertrauen scheint eine häufige Ursache für Verwirrung und Fehler bei der Arbeit mit Datum und Uhrzeit zu sein.
Wenn Sie anrufen, now()
übergeben Sie die gewünschte / erwartete Zeitzone, die zugewiesen werden soll. Verwenden Sie die DateTimeZone
Klasse.
DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zoneMontréal );
Diese Klasse hält eine Konstante für die UTC- Zeitzone.
DateTime now = DateTime.now( DateTimeZone.UTC );
Wenn Sie die aktuelle Standardzeitzone der JVM wirklich verwenden möchten, rufen Sie explizit auf, damit sich Ihr Code selbst dokumentiert.
DateTimeZone zoneDefault = DateTimeZone.getDefault();
ISO 8601
Lesen Sie mehr über ISO 8601- Formate. Sowohl java.time als auch Joda-Time verwenden die sinnvollen Formate dieses Standards als Standard für das Parsen und Generieren von Zeichenfolgen.
† Eigentlich java.util.Date hat eine Zeitzone hat, tief begraben unter Schichten von Quellcode. Für die meisten praktischen Zwecke wird diese Zeitzone ignoriert. Als Kurzform sagen wir also, dass java.util.Date keine Zeitzone hat. Darüber hinaus ist diese vergrabene Zeitzone nicht diejenige, die von der toString
Methode von Date verwendet wird. Diese Methode verwendet die aktuelle Standardzeitzone der JVM. Umso mehr Grund, diese verwirrende Klasse zu vermeiden und bei Joda-Time und java.time zu bleiben.