Anleitung zu DateTimeFormatter

Leitfaden zu DateTimeFormatter

1. Überblick

In diesem Lernprogramm werden die Java 8DateTimeFormatter-Klasse und ihre Formatierungsmuster. erläutert. Außerdem werden mögliche Anwendungsfälle für diese Klasse erörtert.

Wir könnenDateTimeFormatter verwenden, um Datums- und Uhrzeitangaben in einer App mit vordefinierten oder benutzerdefinierten Mustern einheitlich zu formatieren.

2. DateTimeFormatter mit vordefinierten Instanzen

DateTimeFormatter comes with multiple predefined date/time formats entsprechen den ISO- und RFC-Standards. Beispielsweise können wir die Instanz vonISO_LOCAL_DATEverwenden, um ein Datum wie "2018-03-09" zu analysieren:

DateTimeFormatter.ISO_LOCAL_DATE.format(LocalDate.of(2018, 3, 9));

Um ein Datum mit einem Versatz zu analysieren, können wirISO_OFFSET_DATE verwenden, um eine Ausgabe wie "2018-03-09-03: 00" zu erhalten:

DateTimeFormatter.ISO_OFFSET_DATE.format(LocalDate.of(2018, 3, 9).atStartOfDay(ZoneId.of("UTC-3")));

Most of the predefined instances of the DateTimeFormatter class are focused on the ISO-8601 standard. ISO-8601 ist ein internationaler Standard für die Formatierung von Datum und Uhrzeit.

Es gibt jedoch eine andere vordefinierte Instanz, die RFC-1123, Anforderung für Internet-Hosts,published von der IETF analysiert:

DateTimeFormatter.RFC_1123_DATE_TIME.format(LocalDate.of(2018, 3, 9).atStartOfDay(ZoneId.of("UTC-3")));

Dieses Snippet generiert 'Fri, 9 Mar 2018 00:00:00 -0300'.

Manchmal müssen wir das Datum, das wir erhalten, alsString eines bekannten Formats ändern. Wir können dieparse()-Methode verwenden:

LocalDate.from(DateTimeFormatter.ISO_LOCAL_DATE.parse("2018-03-09")).plusDays(3);

Das Ergebnis dieses Code-Snippets ist eineLocalDate-Darstellung für den 12. März 2018.

3. DateTimeFormatter mitFormatStyle

Manchmal möchten wir Daten möglicherweise auf eine für Menschen lesbare Weise drucken.

In solchen Fällen können wirjava.time.format.FormatStyle enum (FULL, LONG, MEDIUM, SHORT) Werte mit unserenDateTimeFormatter verwenden:

LocalDate anotherSummerDay = LocalDate.of(2016, 8, 23);
System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).format(anotherSummerDay));
System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).format(anotherSummerDay));
System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).format(anotherSummerDay));
System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).format(anotherSummerDay));

Die Ausgabe dieser verschiedenen Formatierungsstile desselben Datums lautet:

Tuesday, August 23, 2016
August 23, 2016
Aug 23, 2016
8/23/16

Wir können auch vordefinierte Formatierungsstile für Datum und Uhrzeit verwenden. UmFormatStyle mit der Zeit zu verwenden, müssen wir die Instanz vonZonedDateTimeverwenden, andernfalls wird einDateTimeException ausgelöst:

LocalDate anotherSummerDay = LocalDate.of(2016, 8, 23);
LocalTime anotherTime = LocalTime.of(13, 12, 45);
ZonedDateTime zonedDateTime = ZonedDateTime.of(anotherSummerDay, anotherTime, ZoneId.of("Europe/Helsinki"));
System.out.println(
  DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL)
  .format(zonedDateTime));
System.out.println(
  DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
  .format(zonedDateTime));
System.out.println(
  DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
  .format(zonedDateTime));
System.out.println(
  DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)
  .format(zonedDateTime));

Beachten Sie, dass wir diesmal dieofLocalizedDateTime()-Methode vonDateTimeFormatter verwendet haben.

Und die Ausgabe, die wir erhalten, ist:

Tuesday, August 23, 2016 1:12:45 PM EEST
August 23, 2016 1:12:45 PM EEST
Aug 23, 2016 1:12:45 PM
8/23/16 1:12 PM

Wir können auchFormatStyle verwenden, um eine Datumszeit zu analysieren, dieString beispielsweise inZonedDateTime konvertiert.

Wir können dann den analysierten Wert verwenden, um die Datums- und Zeitvariable zu manipulieren:

ZonedDateTime dateTime = ZonedDateTime.from(
  DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL)
    .parse("Tuesday, August 23, 2016 1:12:45 PM EET"));
System.out.println(dateTime.plusHours(9));

Die Ausgabe dieses Snippets ist "2016-08-23T22: 12: 45 + 03: 00 [Europa / Bukarest]". Beachten Sie, dass sich die Zeit in "22:12:45" geändert hat.

4. DateTimeFormatter mit benutzerdefinierten Formaten

Predefined and built-in formatters and styles can cover a lot of situations. Manchmal müssen Datum und Uhrzeit jedoch etwas anders formatiert werden. Hier kommen benutzerdefinierte Formatierungsmuster ins Spiel.

4.1. DateTimeFormatter für Datum

Angenommen, wir möchten einjava.time.LocalDate-Objekt in einem regulären europäischen Format wie dem 31.12.2018 präsentieren. Dazu könnten wir die Factory-MethodeDateTimeFormatter.ofPattern(“dd.MM.yyyy”). aufrufen

Dadurch wird eine geeigneteDateTimeFormatter-Instanz erstellt, mit der wir unser Datum formatieren können:

String europeanDatePattern = "dd.MM.yyyy";
DateTimeFormatter europeanDateFormatter = DateTimeFormatter.ofPattern(europeanDatePattern);
System.out.println(europeanDateFormatter.format(LocalDate.of(2016, 7, 31)));

Die Ausgabe dieses Code-Snippets lautet „31.07.2016“.

Es gibt viele verschiedene Musterbuchstaben, mit denen wir ein Format für Daten erstellen können, das unseren Anforderungen entspricht:

  Symbol  Meaning                     Presentation      Examples
  ------  -------                     ------------      -------
   u       year                        year              2004; 04
   y       year-of-era                 year              2004; 04
   M/L     month-of-year               number/text       7; 07; Jul; July; J
   d       day-of-month                number            10

Dies ist ein Auszug aus der Klasseofficial Java documentation bisDateTimeFormatter.

The number of letters in the pattern format is significant.

Wenn wir für den Monat ein zweistelliges Muster verwenden, erhalten wir eine zweistellige Monatsdarstellung. Wenn die Monatszahl kleiner als 10 ist, wird sie mit einer Null aufgefüllt. Wenn wir die erwähnte Auffüllung mit Nullen nicht benötigen, können wir ein Ein-Buchstaben-Muster "M" verwenden, das den Januar als "1" anzeigt.

Wenn wir für den Monat "MMMM" ein Muster mit vier Buchstaben verwenden, erhalten wir eine Darstellung in "vollständiger Form". In unserem Beispiel ist es „Juli“. Ein 5-Buchstaben-Muster, "MMMMM", bewirkt, dass der Formatierer die "schmale Form" verwendet. In unserem Fall würde "J" verwendet.

Ebenso kann ein benutzerdefiniertes Formatierungsmuster verwendet werden, um eine Zeichenfolge zu analysieren, die ein Datum enthält:

DateTimeFormatter europeanDateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
System.out.println(LocalDate.from(europeanDateFormatter.parse("15.08.2014")).isLeapYear());

Dieses Code-Snippet prüft, ob das Datum "15.08.2014" ein Schaltjahr ist und nicht.

4.2. DateTimeFormatter für die Zeit

Es gibt auch Musterbuchstaben, die für Zeitmuster verwendet werden können:

  Symbol  Meaning                     Presentation      Examples
  ------  -------                     ------------      -------
   H       hour-of-day (0-23)          number            0
   m       minute-of-hour              number            30
   s       second-of-minute            number            55
   S       fraction-of-second          fraction          978
   n       nano-of-second              number            987654321

Es ist ganz einfach,DateTimeFormatter zum Formatieren einerjava.time.LocalTime-Instanz zu verwenden. Angenommen, wir möchten die Zeit (Stunden, Minuten und Sekunden) mit einem Doppelpunkt getrennt anzeigen:

String timeColonPattern = "HH:mm:ss";
DateTimeFormatter timeColonFormatter = DateTimeFormatter.ofPattern(timeColonPattern);
LocalTime colonTime = LocalTime.of(17, 35, 50);
System.out.println(timeColonFormatter.format(colonTime));

Dies erzeugt die Ausgabe „17:35:50“.

Wenn wir der Ausgabe Millisekunden hinzufügen möchten, sollten wir dem Muster "SSS" hinzufügen:

String timeColonPattern = "HH:mm:ss SSS";
DateTimeFormatter timeColonFormatter = DateTimeFormatter.ofPattern(timeColonPattern);
LocalTime colonTime = LocalTime.of(17, 35, 50).plus(329, ChronoUnit.MILLIS);
System.out.println(timeColonFormatter.format(colonTime));

Was die Ausgabe „17:35:50 329“ ergibt.

Beachten Sie, dass „HH“ ein Stundenmuster ist, das eine Ausgabe von 0 bis 23 generiert. Wenn wir AM / PM anzeigen möchten, sollten wir stundenlang Kleinbuchstaben "hh" verwenden und ein "a" -Muster hinzufügen:

String timeColonPattern = "hh:mm:ss a";
DateTimeFormatter timeColonFormatter = DateTimeFormatter.ofPattern(timeColonPattern);
LocalTime colonTime = LocalTime.of(17, 35, 50);
System.out.println(timeColonFormatter.format(colonTime));

Die generierte Ausgabe ist „05:35:50 PM“.

Möglicherweise möchten wir die ZeitString mit unserem benutzerdefinierten Formatierer analysieren und prüfen, ob es vor Mittag ist:

DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("hh:mm:ss a");
System.out.println(LocalTime.from(timeFormatter.parse("12:25:30 AM")).isBefore(LocalTime.NOON));

Die Ausgabe dieses letzten Snippets zeigt, dass die angegebene Zeit tatsächlich vor Mittag liegt.

4.3. DateTimeFormatter für Zeitzonen

Often we want to see a time zone of some specific date-time variable. Wenn wir zufällig eine in New York ansässige Datums- und Uhrzeitangabe (UTC -4) verwenden, können wir für den Namen der Zeitzone den Musterbuchstaben „z“ verwenden:

String newYorkDateTimePattern = "dd.MM.yyyy HH:mm z";
DateTimeFormatter newYorkDateFormatter = DateTimeFormatter.ofPattern(newYorkDateTimePattern);
LocalDateTime summerDay = LocalDateTime.of(2016, 7, 31, 14, 15);
System.out.println(newYorkDateFormatter.format(ZonedDateTime.of(summerDay, ZoneId.of("UTC-4"))));

Dies erzeugt die Ausgabe „31.07.2016 14:15 UTC-04: 00“.

Wir können Datums-Zeitzeichenfolgen mit Zeitzonen analysieren, so wie wir es früher getan haben:

DateTimeFormatter zonedFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm z");
System.out.println(ZonedDateTime.from(zonedFormatter.parse("31.07.2016 14:15 GMT+02:00")).getOffset().getTotalSeconds());

Die Ausgabe dieses Codes beträgt erwartungsgemäß "7200" Sekunden oder 2 Stunden.

Wir müssen sicherstellen, dass wir derparse()-Methode eine korrekte Datums- und UhrzeitString geben. Wenn wir "31.07.2016 14:15" ohne Zeitzone anzonedFormatter aus dem letzten Code-Snippet übergeben, erhalten wirDateTimeParseException.

5. Fazit

In this tutorial, we’ve discussed how to use the DateTimeFormatter class for format dates and times. Wir haben reale Beispielmuster verwendet, die häufig bei der Arbeit mit Datums- und Uhrzeitinstanzen auftreten.

Inprevious tutorials erfahren Sie mehr über die API von Java 8Date/Time. Wie immer ist der im Tutorial verwendete Quellcodeover on GitHub verfügbar.