Évitez le calendrier Java autant que possible

tl;dr

Pour le traitement des dates Java, utilisez la classe LocalDate </ font> plutôt que la classe Calendar.

c'est tout.

Récit

C'est une vraie histoire qui s'est produite sur mon lieu de travail.

un événement

Le vendredi 31 mai 2019, la CI que je dirige régulièrement sur mon projet a soudainement chuté.

J'utilise Jenkins pour exécuter tous les tests du code source écrit en Java 8 quatre fois par jour, mais il a soudainement commencé à générer une erreur alors qu'il était tout vert jusqu'à hier.

En regardant le journal des erreurs, la partie pertinente est la partie où la classe Calendar de la bibliothèque standard Java est utilisée. L'utilisation consiste à obtenir le nombre de jours du mois en cours.

Dans le code de test, juin 2017 a été simulé comme la date actuelle, mais le code à tester est le suivant. (* * Ceci n'est qu'un exemple et est différent du code réel. *)

Calendar calendar = Calendar.getInstance();

calendar.set(Calendar.YEAR, LocalDate.now().getYear());
calenar.set(Calendar.MONTH, LocalDate.now().getMonth() - 1);  //Comme le mois commence à 0, définissez 0 pour janvier, par exemple.

//Obtenez le nombre de jours du mois
int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

Comme nous sommes en juin, bien sûr, 30 est la valeur de retour, mais lorsque je l'ai déboguée, elle était de 31.

problème

Le code de test qui fonctionnait depuis le début du développement il y a quelques années est soudainement devenu rouge, alors je me suis demandé s'il y avait une modification dans la bibliothèque, mais j'ai essayé différentes choses. Je ne trouve pas de tels articles. ..

Si vous saisissez "Calendrier Java b" dans la recherche Google, il semble y avoir un problème et le "bug du calendrier Java" est donc recommandé.

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

Je n'ai pas trouvé d'article qui ressemblait à ça, mais il n'était pas officiellement obsolète, mais ce n'était pas fortement recommandé. ** Utilisons LocalDate introduit dans Java8 **.

Solution

Utilisez LocalDate # lengthOfMonth.

En premier lieu, comme LocalDate est utilisé dans le processus d'acquisition de la date actuelle, il est judicieux d'utiliser la méthode de la classe LocalDate telle quelle, mais il y a quelques années, l'utilisation de LocalData introduite dans Java 8 était largement utilisée. Probablement pas.

Faites ce qui suit:

today = LocalDate.now();

//Obtenez le nombre de jours du mois
int days = today.lengthOfMonth();

Avec cela, CI peut être retourné en toute sécurité. Vous pouvez travailler l'esprit tranquille.

fin.

Recommended Posts

Évitez le calendrier Java autant que possible
Évitez autant que possible l'accès à la base de données à partir de boucles
Assurez-vous que deux séquences non alignées correspondent aussi parfaitement que possible (Java)
Évitez l'erreur que Yuma a donnée en Java
JavaScript vu de Java