Eine peinliche Geschichte, die am selben Tag behandelt wurde, als versucht wurde, die Daten 3/31 und 4/1 zu vergleichen [Java / Kalender]

Datumsobjekte vergleichen

Ich wollte eine Prüfung vor und nach dem Einstellungsdatum und dem Einstellungsdatum durchführen, also habe ich mit GregorianCalendar (einer konkreten Unterklasse des Kalenders) ein Datumsobjekt wie folgt erstellt und es mit compareTo verglichen.

dateCheck.java



Date march = new GregorianCalendar(2019,3,31).getTime(); //31. März 2019(Tag)
Date april = new GregorianCalendar(2019,4,1).getTime(); //01. April 2019(Mond)
System.out.println(march.compareTo(april)); //Ausführungsergebnis: 0

Der Rückgabewert der compareTo-Methode (Vergleich des Zeitwerts, der durch die beiden Kalenderobjekte dargestellt wird (Versatz in Millisekunden gegenüber dem ursprünglichen Zeitraum)) -Referenzobjekt <Argumentobjekt → Wert kleiner als 0 -Referenzobjekt> Argumentobjekt → Wert größer als 0 -Referenzobjekt = Argumentobjekt → 0

Da die seit der Referenzzeit verstrichene Millisekunde am 1. April größer ist als am 31. März (das Datum liegt später), ist es wünschenswert, einen Wert kleiner als 0 zurückzugeben. ** Aber das Ergebnis ist 0 (gleich). ** ** **

Überprüfen Sie das Datum

Versuchen Sie, zwei Datumsobjekte an die Konsole auszugeben.

Wed May 01 00:00:00 JST 2019
Wed May 01 00:00:00 JST 2019

Beide sind Mittwoch, 1. Mai 2019. Ich habe hier "Ah" bemerkt.

Der Monat beginnt bei 0

Ich habe das komplett vergessen. Mit anderen Worten, das Datum wird in ** 31. März → 31. April und 1. April → 1. Mai ** umgewandelt. Der 31. April existiert nicht, aber es scheint, dass er nur nach der verstrichenen Millisekunde ohne ein solches Problem beurteilt wird.

Wenn Sie also den Wert minus 1 auf den Monat setzen, wird er ordnungsgemäß konvertiert, wie Sie möchten.

dateCheck.java



Date march = new GregorianCalendar(2019,2,31).getTime(); //Ausführungsergebnis: So 31. März 00:00:00 JST 2019
Date april = new GregorianCalendar(2019,3,1).getTime(); //Ausführungsergebnis: Mo Apr 01 00:00:00 JST 2019

System.out.println(march.compareTo(april)); //Ausführungsergebnis:-1

Strenger und nicht strenger Modus der Kalenderklasse

Übrigens, wenn Sie sich die [Referenz] ansehen (https://docs.oracle.com/javase/jp/8/docs/api/java/util/Calendar.html), verwendet der Kalender * bei der Interpretation von Kalenderfeldern. * Es scheint zwei Modi zu verwenden, streng und nicht streng **.

Strenger Modus: Kalender löst eine Ausnahme aus, wenn im Kalenderfeld eine Nichtübereinstimmung vorliegt Nicht strenger Modus: Der Kalender akzeptiert einen größeren Bereich von Kalenderfeldwerten als er erzeugt

Standardmäßig befindet es sich im nicht strengen Modus. Wenn Sie jedoch in den strengen Modus wechseln und ein Datum außerhalb des Bereichs festlegen, wird der 31. April nicht akzeptiert.

dateCheck.java


Calendar march = new GregorianCalendar();
Calendar april = new GregorianCalendar();
april.setLenient(false); //Wechseln Sie in den strengen Modus
march.setWeekDate(2019,3,31); //Erfolg
april.setWeekDate(2019,3,31); //Fehler: Java.lang.IllegalArgumentException: invalid dayOfWeek: 31

Wie oben erwähnt, ist es sehr peinlich, aber es kann ein super super Anfänger sein. Ich lasse es in meinem Kopf.

Recommended Posts

Eine peinliche Geschichte, die am selben Tag behandelt wurde, als versucht wurde, die Daten 3/31 und 4/1 zu vergleichen [Java / Kalender]
Es wurde ein Fehler behoben, der beim Versuch auftrat, Spark in einer Umgebung zu verwenden, in der Java 8 und Java 11 gleichzeitig vorhanden sind
Lösung, die beim Versuch, mit Java eine Verbindung zu DB (MySQL) herzustellen, einen Fehler verursacht
Zusammenfassung beim Versuch, Solr in Java zu verwenden und eine Fehlermeldung zu erhalten (Solr 6.x)
Eine Geschichte, nach der ich süchtig war, als ich einen Schlüssel bekam, der automatisch auf MyBatis ausprobiert wurde
Java: Eine Geschichte, in der ich mich unwohl fühlte, als mir beigebracht wurde, Strings ohne Grund mit Gleichen zu vergleichen.
Eine Geschichte, die das Problem löste, dass die Java (jdk) -Version zu hoch war, um die H2O-Bibliothek in R und R Studio zu verwenden.
Ein Kampf, wenn Sie versuchen, dasselbe wie Javas XOR-Modus in C # zu tun
Eine Geschichte, die mir klar wurde, dass ich überhaupt als Ingenieur studieren musste
Java learning_Behavior, wenn ein Feld mit demselben Namen und eine Methode mit demselben Namen in zwei Klassen in einer Vererbungsbeziehung vorhanden sind
20190803_Java & k8s on Azure Die Geschichte vom Festivalbesuch
So führen Sie React und Rails auf demselben Server aus
Die Geschichte, nach der ich beim Einrichten von STS süchtig war