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