tl; dr
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.toString() // Generate a String in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.
2008-01-01T00: 00 + 01: 00 [Europa / Paris]
Übergeben Sie a, um einen String in Ihrem gewünschten Format zu generieren DateTimeFormatter
.
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.format( // Generate a String representing the object’s value.
DateTimeFormatter.ISO_LOCAL_DATE_TIME // Built-in predefined formatter close to what you want.
)
.replace( "T" , " " ) // Replace the standard’s use of a 'T' in the middle with your desired SPACE character.
2008-01-01 00:00:00
Einzelheiten
Andere Antworten sind korrekt, verwenden jedoch alte Datums- und Uhrzeitklassen, die jetzt vom java.time-Framework veraltet sind.
java.time
Das java.time-Framework ist in Java 8 und höher integriert. Ein Großteil der Funktionen von java.time wird auf Java 6 & 7 ( ThreeTen-Backport ) zurückportiert und weiter an Android ( ThreeTenABP ) angepasst .
Ändern Sie zuerst die Eingabezeichenfolge, um der kanonischen Version des ISO 8601-Formats zu entsprechen. Die Standardformate ISO 8601 werden standardmäßig in java.time-Klassen zum Parsen / Generieren von Zeichenfolgen verwendet, die Datums- und Uhrzeitwerte darstellen. Wir müssen diesen SPACE in der Mitte durch a ersetzen T
.
String input = "2008-01-01 13:15:00".replace( " " , "T" ); // → 2008-01-01T13:15:00
Jetzt können wir es als a analysieren LocalDateTime
, wobei "Lokal" keinen bestimmten Ort bedeutet. Dem Eingang fehlen Informationen zum Versatz von UTC oder Zeitzone.
LocalDateTime ldt = LocalDateTime.parse( input );
ldt.toString ()… 2008-01-01T13: 15: 00
Wenn Sie sich weder für die Tageszeit noch für die Zeitzone interessieren, konvertieren Sie zu a LocalDate
.
LocalDate ld = ldt.toLocalDate();
ld.toString ()… 2008-01-01
Erster Moment des Tages
Wenn Sie stattdessen möchten, dass die Uhrzeit auf den ersten Moment des Tages festgelegt wird, verwenden Sie eine ZonedDateTime
Klasse und konvertieren Sie sie in ein LocalDate
Objekt, um ihre atStartOfDay
Methode aufzurufen . Beachten Sie, dass der erste Moment 00:00:00
aufgrund der Sommerzeit oder anderer Anomalien möglicherweise nicht die Zeit ist .
Die Zeitzone ist entscheidend, da das Datum für jeden Moment weltweit je nach Zone variiert. Zum Beispiel ist ein paar Momente nach Mitternacht in Paris ein neuer Tag für die Pariser, aber für die Kanadier immer noch „gestern“ in Montréal.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
LocalDate ldFromZdt = zdt.toLocalDate();
ZonedDateTime zdtStartOfDay = ldFromZdt.atStartOfDay( zoneId );
zdtStartOfDay.toString ()… 2008-01-01T00: 00: 00-05: 00 [Amerika / Montreal]
koordinierte Weltzeit
Extrahieren Sie ein Objekt , um diesen Moment durch die Linse der UTC- Zeitzone zu sehen Instant
. Sowohl das ZonedDateTime
als auch Instant
werden den gleichen Moment auf der Zeitachse darstellen, erscheinen jedoch als zwei verschiedene Wanduhrzeiten .
An Instant
ist die grundlegende Bausteinklasse in java.time, per Definition immer in UTC. Verwenden Sie diese Klasse häufig, da Sie im Allgemeinen Ihre Geschäftslogik, Datenspeicherung und den Datenaustausch in UTC durchführen sollten.
Instant instant = zdtStartOfDay.toInstant();
instant.toString ()… 2008-01-01T05: 00: 00Z
Wir sehen 5 Uhr morgens statt Mitternacht. Im Standardformat steht das Z
am Ende für Zulu
und bedeutet "UTC".
Ü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ürjava.sql.*
Klassen.
Woher bekomme ich die java.time-Klassen?
- Java SE 8 , Java SE 9 und höher
- Eingebaut.
- Teil der Standard-Java-API mit einer gebündelten Implementierung.
- Java 9 fügt einige kleinere Funktionen und Korrekturen hinzu.
- Java SE 6 und Java SE 7
- Android
- Spätere Versionen von Android-Bundle-Implementierungen der Klassen java.time.
- Für frühere Android -Geräte ( <26) passt das ThreeTenABP- Projekt ThreeTen-Backport (oben erwähnt) an. Siehe Verwendung von ThreeTenABP… .
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 .