Alle temporalen Typen überschreiben standardmäßig die toString()-Methode und liefern eine standardisierte Ausgabe. Weiterhin lassen sich die temporalen Typen auch bei String.format(…) und dem java.util.Formatter einsetzen.
format(…)-Methode
Daneben bieten die Typen eine format(…)-Methode, der ein Formatierungsobjekt übergeben wird, sodass individuelle Ausgaben nach einem Muster möglich sind.
Klasse | Formatierungsmethode |
LocalDateTime | format(DateTimeFormatter formatter) |
LocalDate | format(DateTimeFormatter formatter) |
LocalTime | format(DateTimeFormatter formatter) |
ZonedDateTime | format(DateTimeFormatter formatter) |
OffsetDateTime | format(DateTimeFormatter formatter) |
Temporale Klassen nutzen den gleiche Parametertyp DateTimeFormatter
Die format(…)-Methode nimmt einen DateTimeFormatter an, der die Ausgabe beschreibt. Wie kommen wir an einen DateTimeFormatter? Die Klasse hat keinen öffentlichen Konstruktor, sondern Konstanten und statische Fabrikmethoden. Über drei Varianten kommen wir zum konkreten Objekt:
- Es gibt vordefinierte Konstanten für standardisierte ISO/RFC-Ausgaben,
- Methoden für vordefinierte lang/kurz-Formate (auch lokalisiert) und
- Methoden für komplett selbst zusammengestellte Ausgaben.
Die API-Dokumentation zählt die Konstanten mit ihren Formaten aus, Beispiele sind ISO_LOCAL_DATE oder ISO_ZONED_DATE_TIME. Wichtig zu bedenken ist, dass der temporale Typ die Felder auch haben muss! Ein ISO_ZONED_DATE_TIME ist zum Beispiel bei einem LocalDate nicht möglich.
Praktischer sind die statischen ofLocalizedXXX(…)-Methoden, die eine Aufzählung FormatStyle (FULL, LONG, MEDIUM, SHORT) annehmen:
- DateTimeFormatter ofLocalizedDate(FormatStyle dateStyle)
- DateTimeFormatter ofLocalizedDateTime(FormatStyle dateTimeStyle)
- DateTimeFormatter ofLocalizedDateTime(FormatStyle dateStyle, FormatStyle timeStyle)
- DateTimeFormatter ofLocalizedTime(FormatStyle timeStyle)
Einen so aufgebauten DateTimeFormatter lässt sich Zusatzinformation geben mit diversen withXXX(…)-Methoden, etwa withLocale(Locale locale) oder withZone(ZoneId zone).
Beispiel
LocalDateTime now = LocalDateTime.now(); out.println( now.format( BASIC_ISO_DATE ) ); out.println( now.format( ISO_LOCAL_DATE_TIME ) ); out.println( now.format( ofLocalizedDate( SHORT ) ) ); out.println( now.format( ofLocalizedDateTime( MEDIUM ) ) ); out.println( now.format( ofLocalizedDateTime( FULL ).withLocale( FRANCE ) .withZone( ZoneId.of( "America/Cayenne" ) ) ) );
Die Ausgaben sehen so aus:
20170616
2017-06-16T20:39:11.2114379
16.06.17
16.06.2017, 20:39:11
vendredi 16 juin 2017 à 20:39:11 heure de la Guyane française
Eine völlig flexible Ausgabe ermöglicht ein Muster.
Beispiel
LocalDate now = LocalDate.now();
System.out.println( now ); // 2014-03-21
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( „d. MMMM yyyy“ );
String nowAsString = now.format( formatter );
System.out.println( nowAsString ); // 21. März 2014
LocalDate nowAgain = LocalDate.parse( nowAsString, formatter );
System.out.println( nowAgain ); // 2014-03-21
Die API-Dokumentation zu DateTimeFormatter zeigt einige vordefinierte Formatierungsobjekte und listet alle Formatspezifizierer auf.
parse(…)-Methode
Neben dem Formatieren bieten die Typen auch eine statische parse(…)-Methode, die einmal mit einem String-Parameter das Format erwartet, was toString() liefert, und eine Version mit zwei Parametern, wobei dann ein Formatierungsobjekt erlaubt ist, um genau das Format anzugeben, nach dem geparst werden soll.