tl; dr
myUtilDate.toInstant() // Convert `java.util.Date` to `Instant`.
.atOffset( ZoneOffset.UTC ) // Transform `Instant` to `OffsetDateTime`.
.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // Generate a String.
.replace( "T" , " " ) // Put a SPACE in the middle.
2014-11-14 14:05:09
java.time
Der moderne Weg ist mit den java.time-Klassen, die jetzt die problematischen alten Legacy-Datums- / Uhrzeitklassen ersetzen.
Konvertieren Sie zuerst Ihre java.util.Date
in eine Instant
. Die Instant
Klasse repräsentiert einen Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden (bis zu neun (9) Stellen eines Dezimalbruchs).
Konvertierungen in / von java.time werden mit neuen Methoden durchgeführt, die den alten Klassen hinzugefügt wurden.
Instant instant = myUtilDate.toInstant();
Sowohl Sie java.util.Date
als auch java.time.Instant
sind in UTC . Wenn Sie Datum und Uhrzeit als UTC anzeigen möchten, sollten Sie dies auch tun. Rufen Sie toString
auf, um einen String im Standardformat ISO 8601 zu generieren .
String output = instant.toString();
2014-11-14T14: 05: 09Z
Für andere Formate müssen Sie Ihre Instant
in die flexibler umwandeln OffsetDateTime
.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
odt.toString (): 2020-05-01T21: 25: 35.957Z
Sehen Sie, wie der Code live auf IdeOne.com ausgeführt wird .
Geben Sie a an, um einen String in dem gewünschten Format zu erhalten DateTimeFormatter
. Sie können ein benutzerdefiniertes Format angeben. Aber ich würde einen der vordefinierten Formatierer ( ISO_LOCAL_DATE_TIME
) verwenden und den T
in seiner Ausgabe durch ein Leerzeichen ersetzen .
String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " );
2014-11-14 14:05:09
Übrigens empfehle ich diese Art von Format nicht, bei dem Sie absichtlich die UTC-Versatz- oder Zeitzoneninformationen verlieren . Erzeugt Mehrdeutigkeiten hinsichtlich der Bedeutung des Datums- / Uhrzeitwerts dieser Zeichenfolge.
Achten Sie auch auf Datenverlust, da jeder Bruchteil einer Sekunde in der Darstellung des Datums- / Uhrzeitwerts durch Ihren String ignoriert (effektiv abgeschnitten) wird.
Um denselben Moment durch die Linse der Wanduhrzeit einer bestimmten Region zu sehen , wenden Sie a ZoneId
an , um a zu erhalten ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
zdt.toString (): 2014-11-14T14: 05: 09-05: 00 [Amerika / Montreal]
Um einen formatierte String zu erzeugen, tun das gleiche wie oben , aber ersetzen odt
mit zdt
.
String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " );
2014-11-14 14:05:09
Wenn Sie diesen Code sehr oft ausführen, möchten Sie möglicherweise etwas effizienter sein und den Aufruf von vermeiden String::replace
. Wenn Sie diesen Anruf abbrechen, wird Ihr Code auch kürzer. Wenn gewünscht, geben Sie Ihr eigenes Formatierungsmuster in Ihrem eigenen DateTimeFormatter
Objekt an. Zwischenspeichern Sie diese Instanz als Konstante oder Mitglied zur Wiederverwendung.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" ); // Data-loss: Dropping any fractional second.
Wenden Sie diesen Formatierer an, indem Sie die Instanz übergeben.
String output = zdt.format( f );
Über java.time
Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Datum Zeitklassen wie java.util.Date
, .Calendar
, &java.text.SimpleDateFormat
.
Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu java.time.
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen.
Ein großer Teil der java.time Funktionalität zurückportiert zu Java 6 und 7 in ThreeTen-Backport und weiter angepasst Android in ThreeTenABP (siehe So verwenden ... ).
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.