Wie analysiere / formatiere ich Daten mit LocalDateTime? (Java 8)

339

Java 8 hat eine neue java.time- API für die Arbeit mit Datum und Uhrzeit hinzugefügt ( JSR 310 ).

Ich habe Datum und Uhrzeit als Zeichenfolge (z "2014-04-08 12:30". B. ). Wie kann ich eine LocalDateTimeInstanz aus der angegebenen Zeichenfolge erhalten?

Nachdem ich mit dem LocalDateTimeObjekt gearbeitet habe: Wie kann ich die LocalDateTimeInstanz dann wieder in eine Zeichenfolge mit demselben Format wie oben konvertieren?

micha
quelle
11
Zu Ihrer Information, die meisten Leute würden die meiste Zeit ZonedDateTimeeher eine als eine wollen LocalDateTime. Der Name ist nicht intuitiv; das Localbedeutet , jede Ortschaft im Allgemeinen eher als eine bestimmte Zeitzone. Als solches ist ein LocalDateTimeObjekt nicht an die Zeitlinie gebunden. Um eine Bedeutung zu haben und einen bestimmten Moment in der Zeitleiste zu erhalten, müssen Sie eine Zeitzone anwenden.
Basil Bourque
In meiner Antwort finden Sie eine Erklärung zu LocalDateTimevs. ZonedDateTimevs. OffsetDateTimevs. Instantvs. LocalDatevs. LocalTime, wie Sie ruhig bleiben können, warum es so kompliziert ist und wie Sie es beim ersten Schuss richtig machen.
Ondra Žižka
1
Wenn es nicht unpraktisch lang LocalDateTimewäre , wäre es wahrscheinlich benannt worden ZonelessOffsetlessDateTime.
Ondra Žižka

Antworten:

533

Datum und Uhrzeit analysieren

Um ein LocalDateTimeObjekt aus einer Zeichenfolge zu erstellen , können Sie die statische LocalDateTime.parse()Methode verwenden. Es braucht einen String und einen DateTimeFormatterals Parameter. Mit DateTimeFormatterwird das Datums- / Uhrzeitmuster angegeben.

String str = "1986-04-08 12:30";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);

Formatieren von Datum und Uhrzeit

Um eine formatierte Zeichenfolge aus einem LocalDateTimeObjekt zu erstellen , können Sie die format()Methode verwenden.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTime = LocalDateTime.of(1986, Month.APRIL, 8, 12, 30);
String formattedDateTime = dateTime.format(formatter); // "1986-04-08 12:30"

Beachten Sie, dass einige häufig verwendete Datums- / Uhrzeitformate als Konstanten in vordefiniert sind DateTimeFormatter. Beispiel: Wenn Sie DateTimeFormatter.ISO_DATE_TIMEdie LocalDateTimeInstanz von oben formatieren, wird die Zeichenfolge angezeigt "1986-04-08T12:30:00".

Die Methoden parse()und format()sind für alle datums- / zeitbezogenen Objekte verfügbar (z. B. LocalDateoder ZonedDateTime).

micha
quelle
77
Zu beachten ist, dass DateTimeFormatter unveränderlich und threadsicher ist. Daher wird empfohlen, es nach Möglichkeit in einer statischen Konstante zu speichern.
JodaStephen
@micha was ist, wenn ich "2016-12-31T07: 59: 00.000Z" dieses Datumsformat habe?
Dawood Ahmed
14
@ DawoodAbbasi versuchenDateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX")
Ray Hulha
1
@Loenix Vielleicht liegt das daran, dass Sie versuchen, format()die LocalDateTime-Klasse anstelle der Instanz aufzurufen? Zumindest das ist , was ich getan habe: Ich verwirrte DateTimemit dateTimeim Beispiel oben.
Glaed
2
Vergessen Sie nicht den Großbuchstaben auf MM
Wesos de Queso
159

Sie können auch verwenden LocalDate.parse()oder LocalDateTime.parse()auf einem , Stringohne es mit einem Muster bereitstellt, wenn die Stringin ist ISO-8601 - Format .

zum Beispiel,

String strDate = "2015-08-04";
LocalDate aLD = LocalDate.parse(strDate);
System.out.println("Date: " + aLD);

String strDatewithTime = "2015-08-04T10:11:30";
LocalDateTime aLDT = LocalDateTime.parse(strDatewithTime);
System.out.println("Date with Time: " + aLDT);

Ausgabe ,

Date: 2015-08-04
Date with Time: 2015-08-04T10:11:30

und DateTimeFormatternur verwenden, wenn Sie sich mit anderen Datumsmustern befassen müssen.

Im folgenden Beispiel steht dd MMM uuuu beispielsweise für den Tag des Monats (zwei Ziffern), drei Buchstaben des Monatsnamens (Jan, Feb, Mar, ...) und ein vierstelliges Jahr:

DateTimeFormatter dTF = DateTimeFormatter.ofPattern("dd MMM uuuu");
String anotherDate = "04 Aug 2015";
LocalDate lds = LocalDate.parse(anotherDate, dTF);
System.out.println(anotherDate + " parses to " + lds);

Ausgabe

04 Aug 2015 parses to 2015-08-04

Denken Sie auch daran, dass das DateTimeFormatterObjekt bidirektional ist. Es kann sowohl die Eingabe analysieren als auch die Ausgabe formatieren.

String strDate = "2015-08-04";
LocalDate aLD = LocalDate.parse(strDate);
DateTimeFormatter dTF = DateTimeFormatter.ofPattern("dd MMM uuuu");
System.out.println(aLD + " formats as " + dTF.format(aLD));

Ausgabe

2015-08-04 formats as 04 Aug 2015

(Siehe vollständige Liste der Muster zum Formatieren und Analysieren von DateFormatter. )

  Symbol  Meaning                     Presentation      Examples
  ------  -------                     ------------      -------
   G       era                         text              AD; Anno Domini; A
   u       year                        year              2004; 04
   y       year-of-era                 year              2004; 04
   D       day-of-year                 number            189
   M/L     month-of-year               number/text       7; 07; Jul; July; J
   d       day-of-month                number            10

   Q/q     quarter-of-year             number/text       3; 03; Q3; 3rd quarter
   Y       week-based-year             year              1996; 96
   w       week-of-week-based-year     number            27
   W       week-of-month               number            4
   E       day-of-week                 text              Tue; Tuesday; T
   e/c     localized day-of-week       number/text       2; 02; Tue; Tuesday; T
   F       week-of-month               number            3

   a       am-pm-of-day                text              PM
   h       clock-hour-of-am-pm (1-12)  number            12
   K       hour-of-am-pm (0-11)        number            0
   k       clock-hour-of-am-pm (1-24)  number            0

   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
   A       milli-of-day                number            1234
   n       nano-of-second              number            987654321
   N       nano-of-day                 number            1234000000

   V       time-zone ID                zone-id           America/Los_Angeles; Z; -08:30
   z       time-zone name              zone-name         Pacific Standard Time; PST
   O       localized zone-offset       offset-O          GMT+8; GMT+08:00; UTC-08:00;
   X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;
   x       zone-offset                 offset-x          +0000; -08; -0830; -08:30; -083015; -08:30:15;
   Z       zone-offset                 offset-Z          +0000; -0800; -08:00;

   p       pad next                    pad modifier      1

   '       escape for text             delimiter
   ''      single quote                literal           '
   [       optional section start
   ]       optional section end
   #       reserved for future use
   {       reserved for future use
   }       reserved for future use
Sufiyan Ghori
quelle
11
Diese Antwort berührte ein wichtiges Thema: Verwenden Sie nach Möglichkeit vordefinierte Formatierer, z. B. erstellen Sie KEINE Formatierungsbasis auf "JJJJ-MM-TT", sondern verwenden Sie stattdessen DateTimeFormatter.ISO_LOCAL_DATE. Dadurch sieht Ihr Code viel sauberer aus. Versuchen Sie außerdem, die Verwendung des ISO8061-Formats zu maximieren, da sich dies langfristig auszahlt.
Christopher Yang
Ich möchte ein Datum für die Validierung 2018-08-09 12:00:08analysieren, aber wenn ich es analysiere, wird ein Thinzugefügt, das ich nicht benötige. Gibt es eine Möglichkeit, dies zu tun?
Raghuveer
@Raghuveer Das T ist nur das ISO-8061-Trennzeichen zwischen Datum und Uhrzeit. Wenn Sie stattdessen ein Leerzeichen in Ihrem Format haben, können Sie das Muster einfach yyyy-MM-dd hh:mm:sszum Parsen und Formatieren verwenden. Das T wird immer im Standardformat (ISO-8061) angezeigt, Sie können jedoch auch eigene Muster verwenden.
Egor Hans
39

Beide obigen Antworten erklären sehr gut die Frage nach String-Mustern. Nur für den Fall, dass Sie mit ISO 8601 arbeiten, müssen Sie sich nicht bewerben, DateTimeFormatterda LocalDateTime bereits darauf vorbereitet ist:

Konvertieren Sie LocalDateTime in die Zeitzone ISO8601 String

LocalDateTime ldt = LocalDateTime.now(); 
ZonedDateTime zdt = ldt.atZone(ZoneOffset.UTC); //you might use a different zone
String iso8601 = zdt.toString();

Konvertieren Sie von einem ISO8601-String zurück in eine LocalDateTime

String iso8601 = "2016-02-14T18:32:04.150Z";
ZonedDateTime zdt = ZonedDateTime.parse(iso8601);
LocalDateTime ldt = zdt.toLocalDateTime();
Marcio Jasinski
quelle
20

Das Parsen eines Strings mit Datum und Uhrzeit zu einem bestimmten Zeitpunkt (Java nennt es ein " Instant") ist ziemlich kompliziert. Java hat dies in mehreren Iterationen angegangen. Die neueste ein, java.timeund java.time.chrono, deckt nahezu alle Bedürfnisse (außer Zeitdilatation :)).

Diese Komplexität bringt jedoch viel Verwirrung.

Der Schlüssel zum Verständnis der Datumsanalyse ist:

Warum hat Java so viele Möglichkeiten, ein Datum zu analysieren?

  1. Es gibt mehrere Systeme zum Messen einer Zeit. Zum Beispiel wurden die historischen japanischen Kalender aus den Zeitbereichen der Regierungszeit des jeweiligen Kaisers oder der jeweiligen Dynastie abgeleitet. Dann gibt es zB UNIX-Zeitstempel. Glücklicherweise hat es die ganze (Geschäfts-) Welt geschafft, dasselbe zu nutzen.
  2. In der Vergangenheit wurden die Systeme aus verschiedenen Gründen von / nach umgeschaltet . ZB vom julianischen Kalender zum gregorianischen Kalender im Jahr 1582. "Westliche" Daten davor müssen also anders behandelt werden.
  3. Und natürlich geschah die Änderung nicht sofort. Da der Kalender aus den Hauptquartieren einiger Religionen und anderer Teile Europas stammte, die an andere Ernährungsgewohnheiten glaubten, wechselte beispielsweise Deutschland erst im Jahr 1700.

... und warum ist das LocalDateTime, ZonedDateTimeet al. so kompliziert

  1. Es gibt Zeitzonen . Eine Zeitzone ist im Grunde ein "Streifen" * [1] der Erdoberfläche, dessen Autoritäten den gleichen Regeln folgen, wann sie welchen Zeitversatz hat. Dies beinhaltet Sommerzeitregeln.
    Die Zeitzonen ändern sich im Laufe der Zeit für verschiedene Bereiche, hauptsächlich basierend darauf, wer wen erobert. Und die Regeln einer Zeitzone ändern sich auch im Laufe der Zeit .

  2. Es gibt Zeitversätze. Das ist nicht dasselbe wie Zeitzonen, weil eine Zeitzone zB "Prag" sein kann, aber das hat Sommerzeitversatz und Winterzeitversatz.
    Wenn Sie einen Zeitstempel mit einer Zeitzone erhalten, kann der Versatz variieren, je nachdem, in welchem ​​Teil des Jahres er sich befindet. Während der Schaltstunde kann der Zeitstempel zwei verschiedene Zeiten bedeuten, sodass er ohne zusätzliche Informationen nicht zuverlässig sein kann umgewandelt.
    Hinweis: Mit Zeitstempel meine ich "eine Zeichenfolge, die ein Datum und / oder eine Uhrzeit enthält, optional mit einer Zeitzone und / oder einem Zeitversatz."

  3. Mehrere Zeitzonen können für bestimmte Zeiträume denselben Zeitversatz verwenden. Beispielsweise entspricht die GMT / UTC-Zeitzone der Zeitzone "London", wenn der Sommerzeitversatz nicht wirksam ist.

Um es etwas komplizierter zu machen (aber das ist für Ihren Anwendungsfall nicht zu wichtig):

  1. Die Wissenschaftler beobachten die Dynamik der Erde, die sich im Laufe der Zeit ändert. basierend darauf addieren sie am Ende einzelner Jahre Sekunden. ( 2040-12-31 24:00:00Möglicherweise handelt es sich also um eine gültige Datums- und Uhrzeitangabe.) Dies erfordert regelmäßige Aktualisierungen der Metadaten, die Systeme verwenden, um die Datumskonvertierungen richtig durchzuführen. Unter Linux erhalten Sie beispielsweise regelmäßig Updates für die Java-Pakete, einschließlich dieser neuen Daten.
  2. Die Aktualisierungen behalten nicht immer das vorherige Verhalten für historische und zukünftige Zeitstempel bei. Daher kann es vorkommen, dass das Parsen der beiden Zeitstempel um die Änderung einer Zeitzone herum, wenn sie verglichen werden , zu unterschiedlichen Ergebnissen führt, wenn sie auf verschiedenen Versionen der Software ausgeführt werden. Dies gilt auch für den Vergleich zwischen der betroffenen Zeitzone und einer anderen Zeitzone.

    Sollte dies zu einem Fehler in Ihrer Software führen, sollten Sie einen Zeitstempel verwenden, für den keine so komplizierten Regeln gelten, z. B. einen UNIX-Zeitstempel .

  3. Aufgrund von 7 können wir für zukünftige Daten Daten nicht mit Sicherheit genau konvertieren. So kann beispielsweise die aktuelle Analyse von 8524-02-17 12:00:00einige Sekunden nach der zukünftigen Analyse verschoben sein.

Die APIs von JDK haben sich mit den aktuellen Anforderungen weiterentwickelt

  • Die frühen Java-Versionen hatten genau das, java.util.Datewas ein bisschen naiv war, vorausgesetzt, es gibt nur das Jahr, den Monat, den Tag und die Uhrzeit. Dies reichte schnell nicht aus.
  • Auch die Anforderungen der Datenbanken waren unterschiedlich, so dass ziemlich früh java.sql.Dateeingeführt wurde, mit seinen eigenen Einschränkungen.
  • Da beide nicht unterschiedliche Kalender und Zeitzonen gut abdeckten, wurde die CalendarAPI eingeführt.
  • Dies deckte die Komplexität der Zeitzonen immer noch nicht ab. Und doch war die Mischung der oben genannten APIs wirklich ein Problem. Als Java-Entwickler anfingen, an globalen Webanwendungen zu arbeiten, wurden Bibliotheken, die auf die meisten Anwendungsfälle abzielten, wie JodaTime, schnell populär. JodaTime war etwa ein Jahrzehnt lang der De-facto-Standard.
  • Das JDK wurde jedoch nicht in JodaTime integriert, sodass die Arbeit damit etwas umständlich war. Also, nach einer sehr langen Diskussion darüber , wie die Sache zu nähern, JSR-310 wurde geschaffen , hauptsächlich basierend auf JodaTime .

Wie man damit in Java umgeht java.time

Bestimmen Sie, auf welchen Typ ein Zeitstempel analysiert werden soll

Wenn Sie eine Zeitstempelzeichenfolge verwenden, müssen Sie wissen, welche Informationen darin enthalten sind. Dies ist der entscheidende Punkt. Wenn Sie dies nicht richtig verstehen, erhalten Sie kryptische Ausnahmen wie "Instant kann nicht erstellt werden" oder "Zonenversatz fehlt" oder "Unbekannte Zonen-ID" usw.

Enthält es das Datum und die Uhrzeit?

  1. Hat es einen Zeitversatz?
    Ein Zeitversatz ist das +hh:mmTeil. Manchmal +00:00kann es Zals "Zulu-Zeit", UTCals koordinierte Weltzeit oder GMTals mittlere Greenwich-Zeit ersetzt werden. Diese legen auch die Zeitzone fest.
    Für diese Zeitstempel verwenden Sie OffsetDateTime.

  2. Hat es eine Zeitzone?
    Für diese Zeitstempel verwenden Sie ZonedDateTime.
    Die Zone wird entweder durch angegeben

    • Name ("Prag", "Pacific Standard Time", "PST") oder
    • "zone ID" ("America / Los_Angeles", "Europe / London"), dargestellt durch java.time.ZoneId .

    Die Liste der Zeitzonen wird von einer "TZ-Datenbank" zusammengestellt , die von ICAAN unterstützt wird.

    Laut ZoneIdjavadoc können die Zonen-IDs auch irgendwie als Zund versetzt angegeben werden. Ich bin mir nicht sicher, wie dies realen Zonen zugeordnet wird. Wenn der Zeitstempel, der nur eine TZ hat, in eine Schaltstunde der Zeitversatzänderung fällt, ist er mehrdeutig und die Interpretation ist Gegenstand von ResolverStyle(siehe unten).

  3. Wenn dies nicht der Fall ist , wird der fehlende Kontext angenommen oder vernachlässigt. Und der Verbraucher muss sich entscheiden. Es muss also analysiert LocalDateTimeund konvertiert werden, OffsetDateTimeindem die fehlenden Informationen hinzugefügt werden:

    • Sie können davon ausgehen, dass es sich um eine UTC-Zeit handelt. Fügen Sie den UTC-Offset von 0 Stunden hinzu.
    • Sie können davon ausgehen, dass dies eine Zeit des Ortes ist, an dem die Konvertierung stattfindet. Konvertieren Sie es, indem Sie die Zeitzone des Systems hinzufügen.
    • Sie können es vernachlässigen und einfach so verwenden, wie es ist. Dies ist nützlich, z. B. um zweimal zu vergleichen oder zu subtrahieren (siehe Duration) oder wenn Sie es nicht wissen und es nicht wirklich wichtig ist (z. B. lokaler Busfahrplan).

Teilzeitinformationen

  • Nach dem , was der Zeitstempel enthält, können Sie nehmen LocalDate, LocalTime, OffsetTime, MonthDay, Year, oder YearMonthaus ihm heraus.

Wenn Sie die vollständigen Informationen haben, können Sie eine erhalten java.time.Instant. Dies wird auch intern zum Konvertieren zwischen OffsetDateTimeund verwendet ZonedDateTime.

Finden Sie heraus, wie Sie es analysieren können

Es gibt eine umfangreiche Dokumentation, in DateTimeFormatterder sowohl eine Zeitstempelzeichenfolge analysiert als auch eine Zeichenfolge formatiert werden kann.

Die vorgefertigten DateTimeFormatters sollten mehr als alle Standard-Zeitstempelformate abdecken. ISO_INSTANTKann zum Beispiel analysieren 2011-12-03T10:15:30.123457Z.

Wenn Sie ein spezielles Format haben, können Sie Ihren eigenen DateTimeFormatter (der auch ein Parser ist) erstellen .

private static final DateTimeFormatter TIMESTAMP_PARSER = new DateTimeFormatterBuilder()
   .parseCaseInsensitive()
   .append(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SX"))
   .toFormatter();

Ich empfehle, sich den Quellcode von anzuschauen DateTimeFormatterund sich inspirieren zu lassen, wie man einen mit erstellt DateTimeFormatterBuilder. ResolverStyleSehen Sie sich während Ihres Aufenthalts auch an, welche Steuerelemente für die Formate und mehrdeutigen Informationen LENIENT, SMART oder STRICT sind.

TemporalAccessor

Der häufigste Fehler besteht nun darin, auf die Komplexität von einzugehen TemporalAccessor. Dies kommt davon, wie die Entwickler verwendet wurden, um damit zu arbeiten SimpleDateFormatter.parse(String). Richtig, DateTimeFormatter.parse("...")gibt dir TemporalAccessor.

// No need for this!
TemporalAccessor ta = TIMESTAMP_PARSER.parse("2011-... etc");

Ausgestattet mit den Kenntnissen aus dem vorherigen Abschnitt können Sie jedoch bequem den Typ analysieren, den Sie benötigen:

OffsetDateTime myTimestamp = OffsetDateTime.parse("2011-12-03T10:15:30.123457Z", TIMESTAMP_PARSER);

Das brauchst du eigentlich auch DateTimeFormatternicht. Die Typen, die Sie analysieren möchten, haben die parse(String)Methoden.

OffsetDateTime myTimestamp = OffsetDateTime.parse("2011-12-03T10:15:30.123457Z");

In Bezug auf TemporalAccessor, können Sie es verwenden , wenn Sie eine vage Vorstellung davon haben , welche Informationen es in der Zeichenfolge ist, und wollen zur Laufzeit entscheiden.

Ich hoffe, ich habe etwas Licht des Verstehens auf deine Seele geworfen :)

Hinweis: Es gibt einen Backport von java.timeJava 6 und 7: ThreeTen-Backport . Für Android hat es ThreeTenABP .

[1] Nicht nur, dass es sich nicht um Streifen handelt, sondern auch um einige seltsame Extreme. Beispielsweise haben einige benachbarte Pazifikinseln Zeitzonen von +14: 00 und -11: 00. Das heißt, während es auf einer Insel den 1. Mai um 15 Uhr gibt, ist es auf einer anderen Insel noch nicht der 30. April um 12 Uhr (wenn ich richtig gezählt habe :))

Ondra Žižka
quelle
3

ERHALTEN SIE DIE AKTUELLE UTC-ZEIT IM ERFORDERLICHEN FORMAT

// Current UTC time
        OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);

        // GET LocalDateTime 
        LocalDateTime localDateTime = utc.toLocalDateTime();
        System.out.println("*************" + localDateTime);

        // formated UTC time
        DateTimeFormatter dTF = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
        System.out.println(" formats as " + dTF.format(localDateTime));

        //GET UTC time for current date
        Date now= new Date();
        LocalDateTime utcDateTimeForCurrentDateTime = Instant.ofEpochMilli(now.getTime()).atZone(ZoneId.of("UTC")).toLocalDateTime();
        DateTimeFormatter dTF2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
        System.out.println(" formats as " + dTF2.format(utcDateTimeForCurrentDateTime));
Santhosh Hirekerur
quelle
0

Ich fand es wunderbar, mehrere Varianten des Datums-Zeit-Formats wie folgt abzudecken:

final DateTimeFormatterBuilder dtfb = new DateTimeFormatterBuilder();
dtfb.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSSS"))
.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSS"))
.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSS"))
.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS"))
.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSS"))
.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"))
    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
    .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
    .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0);
flowgrad
quelle
1
`` `public final static DateTimeFormatter TIMESTAMP_XX = new DateTimeFormatterBuilder (). appendPattern (" [[uuuu] [- MM] [- dd]] [[HH] [: mm] [: ss] [. SSS]] "). parseDefaulting (ChronoField.YEAR, 2020) .parseDefaulting (ChronoField.MONTH_OF_YEAR, 1) .parseDefaulting (ChronoField.DAY_OF_MONTH, 1) .parseDefaulting (ChronoField.HOUR_OF_DAY, 0) , 0) .parseDefaulting (ChronoField.NANO_OF_SECOND, 0) .toFormatter (); `` `
Alan Stewart