Tl;dr
Instant.now() // Capture the current moment in UTC.
Erzeugen Sie einen String, der diesen Wert darstellt:
Instant.now().toString()
2016-09-13T23:30:52.123Z
Einzelheiten
Als die richtige Antwort von Jon Skeet angegeben, hat ein java.util.Date-Objekt keine Zeitzone † . Aber seine toString
Implementierung wendet die Standardzeitzone der JVM an, wenn sie die String-Darstellung dieses Datum-Zeit-Wertes erzeugt. Verwirrend für den unbedarften Programmierer ist, dass ein Date scheint eine Zeitzone haben sollte, dies aber nicht tut.
Le site java.util.Date
, j.u.Calendar
y java.text.SimpleDateFormat
Klassen, die mit Java gebündelt werden, sind notorisch problematisch. Vermeiden Sie sie. Verwenden Sie stattdessen eine dieser kompetenten Datum-Zeit-Bibliotheken:
java.time (Java 8)
Java 8 bringt eine hervorragende neue java.time.* Paket um die alten java.util.Date/Calendar-Klassen abzulösen.
Die aktuelle Zeit in UTC/GMT zu ermitteln ist ein einfacher Einzeiler
Instant instant = Instant.now();
Das Instant
Klasse ist der grundlegende Baustein in java.time, der einen Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden .
In Java 8 wird der aktuelle Moment nur mit einer Auflösung von bis zu Millisekunden erfasst. Java 9 bringt eine neue Implementierung de Clock
erfasst den aktuellen Zeitpunkt bis zur vollen Nanosekunden-Fähigkeit dieser Klasse, abhängig von der Fähigkeit der Uhrenhardware Ihres Host-Computers.
Es ist toString
Methode erzeugt eine String-Darstellung ihres Wertes mit ein bestimmtes ISO 8601-Format . Dieses Format gibt null, drei, sechs oder neun Ziffern aus ( Millisekunden , Mikrosekunden , oder Nanosekunden ), die zur Darstellung des Sekundenbruchteils erforderlich sind.
Wenn Sie eine flexiblere Formatierung oder andere zusätzliche Funktionen wünschen, dann wenden Sie für UTC selbst einen Offset von Null an ( ZoneOffset.UTC
Konstante ), um eine OffsetDateTime
.
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );
Dump zur Konsole
System.out.println( "now.toString(): " + now );
Wenn es läuft
now.toString(): 2014-01-21T23:42:03.522Z
Über java.time
Le site java.time Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Erbe Datum-Zeit-Klassen wie java.util.Date
, Calendar
, & SimpleDateFormat
.
Weitere Informationen finden Sie in der Oracle-Tutorial . Und suchen Sie auf Stack Overflow nach vielen Beispielen und Erklärungen. Spezifikation ist JSR 310 .
Le site Joda-Time Projekt, jetzt in Wartungsmodus rät zur Migration auf den java.time Klassen.
Sie können umtauschen java.time Objekte direkt mit Ihrer Datenbank. Verwenden Sie eine JDBC-Treiber übereinstimmend mit JDBC 4.2 oder später. Keine Notwendigkeit für Strings, keine Notwendigkeit für java.sql.*
Klassen.
Wo erhält man die java.time-Klassen?
Le site DreiZehn-Extra Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt dient als Versuchsfeld für mögliche zukünftige Erweiterungen von java.time. Sie finden hier vielleicht einige nützliche Klassen wie Interval
, YearWeek
, YearQuarter
y mehr .
Joda-Time
UPDATE: Die Joda-Time Projekt, jetzt in Wartungsmodus rät zur Migration auf den java.time Klassen.
Die Verwendung des Joda-Time Mit der kostenlosen Open-Source-Bibliothek eines Drittanbieters können Sie die aktuelle Datumszeit in nur einer Zeile Code ermitteln.
Joda-Time inspirierte die neuen java.time.*-Klassen in Java 8, hat aber eine andere Architektur. Sie können Joda-Time in älteren Versionen von Java verwenden. Joda-Time funktioniert weiterhin in Java 8 und wird weiterhin aktiv gepflegt (Stand 2014). Das Joda-Time-Team rät jedoch zur Migration auf java.time.
System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );
Ausführlicherer 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 );
Dump zur Konsole
System.out.println( "Local time in ISO 8601 format: " + now );
System.out.println( "Same moment in UTC (Zulu): " + zulu );
Wenn es läuft
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
Für weiteren Beispielcode für die Arbeit mit Zeitzonen, siehe meine Antwort auf eine ähnliche Frage.
Zeitzone
Ich empfehle Ihnen, immer eine Zeitzone anzugeben, anstatt sich implizit auf die aktuelle Standardzeitzone der JVM zu verlassen (die sich jederzeit ändern kann!). Solches Vertrauen scheint eine häufige Ursache für Verwirrung und Fehler in der Datums-Zeit-Arbeit zu sein.
Bei einem Anruf now()
geben Sie die gewünschte/erwartete Zeitzone an, die zugewiesen werden soll. Verwenden Sie die DateTimeZone
Klasse.
DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zoneMontréal );
Diese Klasse enthält eine Konstante für UTC Zeitzone.
DateTime now = DateTime.now( DateTimeZone.UTC );
Wenn Sie wirklich die aktuelle Standardzeitzone der JVM verwenden wollen, machen Sie einen expliziten Aufruf, damit Ihr Code selbstdokumentierend ist.
DateTimeZone zoneDefault = DateTimeZone.getDefault();
ISO 8601
Lesen Sie über ISO 8601 Formate. Sowohl java.time als auch Joda-Time verwenden die sinnvollen Formate dieses Standards als Standard für das Parsen und Erzeugen von Zeichenketten.
† Eigentlich ist java.util.Date tut haben eine Zeitzone, die tief unter Schichten von Quellcode vergraben ist. Für die meisten praktischen Zwecke wird diese Zeitzone ignoriert. Als Abkürzung sagen wir also, dass java.util.Date keine Zeitzone hat. Außerdem ist diese vergrabene Zeitzone pas das von Date's verwendete toString
Methode; diese Methode verwendet die aktuelle Standardzeitzone der JVM. Ein Grund mehr, diese verwirrende Klasse zu vermeiden und sich an Joda-Time und java.time.
0 Stimmen
Ich weiß, diese Art von Themen sind völlig über diskutiert, aber ich fand die commons-lang-Paket wirklich behandelt diese gemeinsame Java-Probleme gut. commons.apache.org/lang/api-2.5/org/apache/commons/lang/time Informieren Sie sich über die verschiedenen Pakete, die sie anbieten.
0 Stimmen
Welche Ortszeit wünschen Sie und mit welcher Genauigkeit. Die meisten Zeitzonen sind relativ zur UTC definiert, mit einem festen Offset gemessen in SI Sekunden, aber die Beziehung der GMT, die auf der Sonnenbeobachtung und einer (leicht) variablen Länge der Sekunde basiert, ist komplexer. Die beiden unterscheiden sich um bis zu 0,9 Sekunden.
4 Stimmen
A
Date
enthält keine Zeitzone, daher ist "aber in der lokalen Zeitzone" nicht korrekt (oder bestenfalls ungenau). Siehe Alles über java.util.Date .