Une histoire embarrassante qui a été traitée comme le même jour en essayant de comparer les dates du 31/03 et du 01/04 [Java / Calendar]

Comparer les objets de date

Je voulais implémenter un contrôle avant et après la date d'embauche et la date d'embauche, j'ai donc créé un objet de date avec GregorianCalendar (une sous-classe concrète de Calendar) comme suit et je l'ai comparé avec compareTo.

dateCheck.java



Date march = new GregorianCalendar(2019,3,31).getTime(); //31 mars 2019(journée)
Date april = new GregorianCalendar(2019,4,1).getTime(); //01 avril 2019(Mois)
System.out.println(march.compareTo(april)); //Résultat de l'exécution: 0

La valeur de retour de la méthode compareTo (comparaison de la valeur de temps représentée par les deux objets Calendar (décalage en millisecondes par rapport à la période d'origine)) -Objet de référence <objet argument → valeur inférieure à 0 -Objet de référence> Objet Argument → Valeur supérieure à 0 -Objet de référence = objet Argument → 0

Étant donné que la milliseconde écoulée à partir de l'heure de référence est plus grande le 1er avril que le 31 mars (la date est postérieure), il est souhaitable de renvoyer une valeur inférieure à 0. ** Mais le résultat est 0 (identique). ** **

Vérifiez la date

Essayez de sortir deux objets de date sur la console.

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

Les deux sont le mercredi 1er mai 2019. J'ai remarqué "Ah" ici.

Le mois commence à 0

J'ai complètement oublié cela. En d'autres termes, la date est convertie en ** 31 mars → 31 avril et 1er avril → 1er mai **. Le 31 avril n'existe pas, mais il semble qu'il ne sera jugé qu'à la milliseconde écoulée sans un tel problème.

Ainsi, si vous définissez la valeur moins 1 sur le mois, il sera converti correctement comme vous le souhaitez.

dateCheck.java



Date march = new GregorianCalendar(2019,2,31).getTime(); //Résultat de l'exécution: dim 31 mars 00:00:00 JST 2019
Date april = new GregorianCalendar(2019,3,1).getTime(); //Résultat de l'exécution: lun 01 avril 00:00:00 JST 2019

System.out.println(march.compareTo(april)); //Résultat de l'exécution:-1

Mode strict et non strict de la classe Calendar

En passant, si vous regardez la Référence, Calendar utilisera * lors de l'interprétation des champs de calendrier. * Il semble utiliser deux modes, strict et non strict **.

Mode strict: le calendrier lève une exception en cas de non-correspondance dans le champ du calendrier Mode non strict: le calendrier accepte une plage de valeurs de champ de calendrier plus large qu'il n'en produit

Par défaut, il est en mode non strict, mais si vous passez en mode strict et définissez une date en dehors de la plage, il n'acceptera pas le 31 avril.

dateCheck.java


Calendar march = new GregorianCalendar();
Calendar april = new GregorianCalendar();
april.setLenient(false); //Passer en mode strict
march.setWeekDate(2019,3,31); //Succès
april.setWeekDate(2019,3,31); //Échec: java.lang.IllegalArgumentException: invalid dayOfWeek: 31

Comme mentionné ci-dessus, c'est très embarrassant, mais c'est peut-être un super super débutant. Je laisse ça dans mon esprit.

Recommended Posts

Une histoire embarrassante qui a été traitée comme le même jour en essayant de comparer les dates du 31/03 et du 01/04 [Java / Calendar]
Résolution d'une erreur survenue lors de la tentative d'utilisation de Spark dans un environnement où Java 8 et Java 11 coexistent
Solution qui donne une erreur lors de la tentative de connexion à DB (MySQL) avec Java
Résumé en essayant d'utiliser Solr en Java et en obtenant une erreur (Solr 6.x)
Une histoire à laquelle j'étais accro lors de l'obtention d'une clé qui a été automatiquement essayée sur MyBatis
Java: Une histoire qui m'a mis mal à l'aise quand on m'a appris à comparer des chaînes avec des égaux sans raison.
Une histoire qui a résolu le problème que la version Java (jdk) était trop élevée pour utiliser la bibliothèque h2o dans R and R Studio.
Une lutte en essayant de faire la même chose que le mode XOR de Java en C #
Une histoire que j'ai réalisé que je devais étudier en premier lieu en tant qu'ingénieur
Java learning_Behavior lorsqu'il y a un champ avec le même nom et une méthode avec le même nom dans deux classes dans une relation d'héritage
20190803_Java & k8s sur Azure L'histoire d'aller au festival
Comment exécuter React et Rails sur le même serveur
L'histoire à laquelle j'étais accro lors de la création de STS