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[Europe/Paris]
Um einen String im gewünschten Format zu erzeugen, übergeben Sie eine 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 aber alte Datum-Zeit-Klassen, die durch das java.time-Framework veraltet sind.
java.time
Das java.time-Framework ist in Java 8 und höher integriert. Ein Großteil der java.time-Funktionalität wurde in Java 6 und 7 zurückportiert ( DreiZehn-Backport ) und weiter angepasst an Android ( DreiZehnABP ).
Ändern Sie zunächst die Eingabezeichenfolge so, dass sie der kanonischen Version des ISO 8601-Formats entspricht. Die Norm ISO 8601 Formate werden standardmäßig in java.time-Klassen zum Parsen/Generieren von Strings verwendet, die Datums-/Zeitwerte darstellen. Wir müssen das SPACE in der Mitte durch ein T
.
String input = "2008-01-01 13:15:00".replace( " " , "T" ); // 2008-01-01T13:15:00
Jetzt können wir es als LocalDateTime
wobei "Lokal" keine bestimmte Örtlichkeit bedeutet. Die Eingabe enthält keine Abweichung von der UTC oder Informationen zur Zeitzone.
LocalDateTime ldt = LocalDateTime.parse( input );
ldt.toString()… 2008-01-01T13:15:00
Wenn Sie sich weder um die Uhrzeit noch um die Zeitzone kümmern, konvertieren Sie in eine LocalDate
.
LocalDate ld = ldt.toLocalDate();
ld.toString() 2008-01-01
Erster Moment des Tages
Wenn Sie stattdessen die Tageszeit auf den ersten Moment des Tages setzen wollen, verwenden Sie eine ZonedDateTime
Klasse, dann konvertieren in eine LocalDate
Objekt, um seine atStartOfDay
Methode. Seien Sie sich bewusst, dass der erste Moment vielleicht nicht der richtige ist 00:00:00
wegen der Sommerzeit oder vielleicht wegen anderer Anomalien.
Die Zeitzone ist von entscheidender Bedeutung, da das Datum zu einem bestimmten Zeitpunkt weltweit je nach Zone unterschiedlich ist. So ist zum Beispiel ein paar Augenblicke nach Mitternacht in Paris ein neuer Tag für die Pariser, aber für die Kanadier in Montréal immer noch "gestern".
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[America/Montreal]
UTC
Um diesen Moment durch die Linse des UTC Zeitzone, extrahieren Sie eine Instant
Objekt. Sowohl die ZonedDateTime
y Instant
denselben Zeitpunkt auf der Zeitachse, erscheinen aber als zwei verschiedene Wanduhrzeiten .
An Instant
ist die Grundbausteinklasse in java.time, die per Definition immer in UTC ist. Verwenden Sie diese Klasse häufig, da Sie Ihre Geschäftslogik, die Datenspeicherung und den Datenaustausch im Allgemeinen in UTC durchführen sollten.
Instant instant = zdtStartOfDay.toInstant();
instant.toString()… 2008-01-01T05:00:00Z
Wir sehen 5 Uhr morgens und nicht Schlag Mitternacht. Im Standardformat wird die Z
am Ende ist die Abkürzung für Zulu
und bedeutet "UTC".
Über java.time
El 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
.
El Joda-Time Projekt, jetzt in Wartungsmodus rät zur Migration auf den java.time Klassen.
Weitere Informationen finden Sie in der Oracle-Tutorial . Auf Stack Overflow finden Sie viele Beispiele und Erklärungen. Spezifikation ist JSR 310 .
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?
ul>* Java SE 8 , Java SE 9 und später
- Eingebaut.
- Teil der Standard-Java-API mit einer gebündelten Implementierung.
- Java 9 fügt einige kleinere Funktionen und Korrekturen hinzu.
- Ein Großteil der java.time-Funktionalität wurde in Java 6 und 7 zurückportiert in DreiZehn-Backport .
- Spätere Versionen von Android bündeln Implementierungen der java.time-Klassen.
- Bei älteren Android-Betriebssystemen (<26) ist die DreiZehnABP Projekt passt sich an DreiZehn-Backport (siehe oben). Siehe Wie benutzt man ThreeTenABP .
El 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 werden hier einige nützliche Klassen finden, wie z.B. Interval
, YearWeek
, YearQuarter
y mehr .