Vermeiden Sie Java Calendar so weit wie möglich

tl;dr

Verwenden Sie für die Java-Datumsverarbeitung die LocalDate-Klasse </ font> anstelle der Calendar-Klasse.

das ist alles.

Geschichte

Dies ist eine echte Geschichte, die an meinem Arbeitsplatz passiert ist.

Veranstaltung

Am Freitag, dem 31. Mai 2019, fiel plötzlich das CI, das ich regelmäßig für mein Projekt durchführe.

Ich benutze Jenkins, um alle Tests des in Java 8 geschriebenen Quellcodes viermal am Tag auszuführen, aber plötzlich wurde ein Fehler ausgegeben, als bis gestern alles grün war.

Im Fehlerprotokoll ist der relevante Teil der Teil, in dem die Calendar-Klasse der Java-Standardbibliothek verwendet wird. Die Verwendung besteht darin, die Anzahl der Tage im aktuellen Monat zu ermitteln.

Im Testcode wurde der Juni 2017 als aktuelles Datum verspottet, der zu testende Code lautet jedoch wie folgt. (* * Dies ist nur ein Beispiel und unterscheidet sich vom tatsächlichen Code. *)

Calendar calendar = Calendar.getInstance();

calendar.set(Calendar.YEAR, LocalDate.now().getYear());
calenar.set(Calendar.MONTH, LocalDate.now().getMonth() - 1);  //Da der Monat bei 0 beginnt, setzen Sie beispielsweise 0 für Januar.

//Holen Sie sich die Anzahl der Tage des Monats
int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

Da es natürlich Juni ist, ist 30 der Rückgabewert, aber als ich ihn debuggte, war es 31.

Problem

Der Testcode, der seit Beginn der Entwicklung vor einigen Jahren ausgeführt wurde, wurde plötzlich rot, sodass ich mich fragte, ob die Bibliothek geändert wurde, aber ich habe verschiedene Dinge ausprobiert. Ich kann solche Artikel nicht finden. ..

Wenn Sie in der Google-Suche "Java-Kalender b" eingeben, scheint ein Problem zu bestehen, sodass "Java-Kalenderfehler" empfohlen wird.

スクリーンショット 2019-06-03 4.56.03.png

Ich konnte keinen Artikel finden, der so aussah, aber nicht offiziell veraltet war, aber nicht sehr zu empfehlen. Ich habe einen Artikel wie ** Lass uns LocalDate verwenden, das in Java8 eingeführt wurde **.

Lösung

Verwenden Sie LocalDate # lengthOfMonth.

Da LocalDate beim Abrufen des aktuellen Datums verwendet wird, ist es zunächst eine gute Idee, die Methode der LocalDate-Klasse so zu verwenden, wie sie ist. Vor einigen Jahren war die in Java 8 eingeführte Verwendung von LocalData jedoch weit verbreitet. Wahrscheinlich nicht.

Gehen Sie einfach wie folgt vor:

today = LocalDate.now();

//Holen Sie sich die Anzahl der Tage des Monats
int days = today.lengthOfMonth();

Damit kann CI sicher gedreht werden. Sie können beruhigt arbeiten.

Ende.

Recommended Posts

Vermeiden Sie Java Calendar so weit wie möglich
Vermeiden Sie den Datenbankzugriff von Schleifen so weit wie möglich
Stellen Sie sicher, dass zwei nicht ausgerichtete Sequenzen so genau wie möglich übereinstimmen (Java)
Vermeiden Sie den Fehler, den Yuma in Java gemacht hat
JavaScript von Java aus gesehen