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.
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.
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.
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.
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.
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.
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.
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