Datumsverarbeitung in Java (LocalDate: Initialisierung)

Umgang mit Daten

Java 8 hat eine neue API für die Verarbeitung von Daten eingeführt. Datumsoperationen, bei denen Datum und Kalender mit Standard-APIs verwendet wurden, wurden in LocalDate, LocalDateTime usw. geändert.

Datumsinitialisierung

Dieses Mal werde ich die einfache Verwendung von LocalDate, die Punkte, die bei der Verwendung zu beachten sind, und die Tatsache, dass es eine so bequeme Verwendung gab, vorstellen. In der zweiten Hälfte werden wir die Vorsichtsmaßnahmen für die Handhabung einführen. Schauen Sie also bitte bis zum Ende.

Mit aktuellem Datum initialisieren

Vor Java8 habe ich den folgenden Code geschrieben, um das aktuelle Datum abzurufen.

Date currentDate1 = new Date();
Calendar currentDate2 = Calendar.getInstance();

Dieser Code enthält jedoch nicht nur das Datum, sondern auch die Uhrzeit. Seien Sie also vorsichtig, wenn Sie nur das Datum verwenden. Wenn Sie beispielsweise Informationen zwischen einem bestimmten Datum abrufen möchten, wirkt sich diese Zeit darauf aus, und Sie erhalten möglicherweise unbeabsichtigte Daten. Sie müssen den Zeitteil verkürzen, um unbeabsichtigte Bewegungen zu verhindern.

final LocalDate currentDate = LocalDate.now();
System.out.println(currentDate);  // 2020-01-15

Wenn Sie das aktuelle Datum mit LocalDate festlegen möchten, verwenden Sie die now-Methode. Im Fall von LocalDate ist das Datum festgelegt und wird nach der Uhrzeit nicht mehr verarbeitet.

Initialisieren Sie durch Angabe eines Datums

Vor Java8 habe ich Code wie den folgenden geschrieben, um ihn nach Datum zu initialisieren.

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, 2019);
calendar.set(Calendar.MONTH, 11);
calendar.set(Calendar.DAY_OF_MONTH, 25);

In diesem Schreibstil beginnt der Monat bei 0, wenn Sie also 11 einstellen, ist es Dezember. Dies kommt auch mit der Zeit, so dass es notwendig ist, die Zeit zu verkürzen.

LocalDate targetDate = LocalDate.of(2019, 12, 25)
System.out.println(targetDate);  // 2019-12-25

Verwenden Sie die of-Methode, um die Initialisierung durch Angabe eines Datums durchzuführen. Im Vergleich zu Datum und Kalender ist das Einstellen des Datums intuitiver und einfacher.

Datum aus Buchstaben initialisieren

Vor Java8 habe ich folgenden Code geschrieben, um das Datum aus einem Brief zu ermitteln:

DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
Date date = formatter.parse("2019/12/25");

Sie können intuitiv von einer Zeichenfolge zu einem Datum wechseln, wie Sie es sehen. Tatsächlich ist SimpleDateFormat jedoch nicht threadsicher. Wenn Sie beim Erstellen von Thread-Programmierungen oder Webanwendungen diese falsch verwenden, wird das Datum eines anderen Benutzers neu geschrieben.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate targetDate = LocalDate.parse("2019/12/25", formatter);
System.out.println(targetDate);  // 2019-12-25

Erstellt eine Instanz vom Typ LocalDate aus einer Datumszeichenfolge. DateTimeFormatter Es ist sicher, weil es threadsicher ist.

LocalDate targetDate = DateTimeFormatter.ofPattern("yyyy/MM/dd")
        .parse("2019/12/25", LocalDate::from);
System.out.println(targetDate);  // 2019-12-25

Sie können auch Code wie diesen schreiben. Der obige Code sieht auf den ersten Blick gut aus, aber es gibt ein Problem.

[Problem 1] Umgang mit genauen Daten

Ich habe den vorherigen Code nachgeahmt und den folgenden Code geschrieben.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd")
        .parse("2020/02/30", LocalDate::from);
System.out.println(targetDate);  // 2020-02-29

Im Februar 2020 gab es nur 29 Tage, und selbst wenn Sie 30 Tage angegeben haben, ist kein Fehler aufgetreten, und es wurde ohne Erlaubnis auf 29 Tage konvertiert. Es mag auf den ersten Blick praktisch erscheinen, ist jedoch nicht für eine genaue Datumsprüfung und -konvertierung geeignet. Schreiben Sie daher wie folgt um.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd")
        .withResolverStyle(ResolverStyle.STRICT)
        .parse("2020/02/30", LocalDate::from);
System.out.println(targetDate);  //Ausnahme aufgetreten

Durch Festlegen von ResolverStyle.STRICT wird das Datum strikt aufgelöst, sodass eine Ausnahme ausgelöst wird, wenn das Datum falsch ist.

[Problem 2] Datumsformat

Ich habe das vorherige Programm ein wenig geändert und eine Version ohne Schrägstriche in der Datumszeichenfolge erstellt.

LocalDate targetDate = DateTimeFormatter.ofPattern("yyyyMMdd")
        .withResolverStyle(ResolverStyle.STRICT)
        .parse("20191225", LocalDate::from);
System.out.println(targetDate); // ???

Dieser Code sieht korrekt aus, aber ich bekomme eine Ausnahme bei der Ausgabe.

DateTimeFormatter (Java Platform SE 8)

Mit Blick auf das obige Dokument ist es wie folgt geschrieben.

Symbol Meaning Presentation Examples
g era text AD; Anno Domini; A
u year year 2004; 04
y year-of-era year 2004; 04

Das Formatsymbol y ist mit dem Jahr der Ära gekennzeichnet. Ära repräsentiert den Kalender, und da das Datum früher streng von STRICT behandelt wurde, konnte der Kalender nicht bestimmt werden und es trat ein Fehler auf.

LocalDate targetDate = DateTimeFormatter.ofPattern("uuuuMMdd")
        .withResolverStyle(ResolverStyle.STRICT)
        .parse("20191225", LocalDate::from);
System.out.println(targetDate);  // 2019-12-25

Ich habe das Symbol von y in u geändert und die Datumskonvertierung war erfolgreich.

LocalDate targetDate = DateTimeFormatter.ofPattern("GGGGyy Jahr MM Monat dd Tag")
        .withLocale(Locale.JAPAN)
        .withChronology(JapaneseChronology.INSTANCE)
        .withResolverStyle(ResolverStyle.STRICT)
        .parse("25. Dezember 2018", LocalDate::from);
System.out.println(targetDate);  // 2018-12-25

Übrigens, wenn Sie sich mit dem japanischen Kalender beschäftigen, schreiben Sie wie oben.

Zusammenfassung

Ab Java 8 ist das Arbeiten mit Datumsangaben viel einfacher geworden. Ich habe jedoch auch festgestellt, dass es bei der Verwendung verschiedene Vorsichtsmaßnahmen gibt. Wenn Sie es im Internet nachschlagen, können Sie sofort sehen, wie es verwendet wird, aber Sie können nicht beurteilen, ob die Methode ohne entsprechende Kenntnisse wirklich korrekt ist. Wir empfehlen außerdem, dass Sie sich die offizielle Dokumentation einschließlich des diesmal eingeführten Inhalts ansehen.

Recommended Posts

Datumsverarbeitung in Java (LocalDate: Initialisierung)
Datumsmanipulation in Java 8
Gemessene Parallelverarbeitung mit Java
Aktuelles Datum in Java anzeigen
Datumsverarbeitung
Informationen zur Dateikopierverarbeitung in Java
So implementieren Sie die Datumsberechnung in Java
Studieren Sie Java 8 (Datums-API im Paket java.time)
Ausgabedatum in Java im erweiterten ISO 8601-Format
So erhalten Sie das Datum mit Java
Partisierung in Java
Änderungen in Java 11
Janken in Java
Java-Thread-Verarbeitung
Java-String-Verarbeitung
[Java] Multithread-Verarbeitung
Umfangsrate in Java
[Java] Stream-Verarbeitung
FizzBuzz in Java
Java iterativer Prozess
Parallele und parallele Verarbeitung in verschiedenen Sprachen (Java Edition)
Einführung des NLP4J- [000] Natural Language Processing Index in Java
Lesen Sie JSON in Java
Interpreter-Implementierung durch Java
Machen Sie einen Blackjack mit Java
[Android / Java] Bildschirmübergang und Rückgabeverarbeitung in Fragmenten
Janken App in Java
Einschränkungsprogrammierung in Java
Setzen Sie Java8 in Centos7
NVL-artiger Typ in Java
Verbinden Sie Arrays in Java
"Hallo Welt" in Java
Aufrufbare Schnittstelle in Java
[Java] Datums- / Zeitoperationen
Kommentare in der Java-Quelle
Azure funktioniert in Java
Formatieren Sie XML in Java
Einfache HTML-Spezialchars in Java
[Java Silver] Informationen zur Initialisierung
Grundlegende Java-Datumsmanipulation
Boyer-Moore-Implementierung in Java
Hallo Welt in Java
Verwenden Sie OpenCV mit Java
WebApi-Memorandum mit Java
Typbestimmung in Java
Befehle in Java ausführen (Ping)
Verschiedene Threads in Java
Implementierung der Heap-Sortierung (in Java)
Zabbix API in Java
ASCII-Kunst in Java
Listen in Java vergleichen
POST JSON in Java
Verwenden Sie MouseListener für die Verarbeitung
Fehler in Java ausdrücken
JAVA-Konstruktoraufrufverarbeitung
Erstellen Sie JSON in Java
Was ist neu in Java 8?
Rufen Sie ein in Swift geschriebenes Programm von Processing (Java) auf.
Java zufällig, verschiedene Verarbeitung
Verwenden Sie PreparedStatement in Java