#21974 - Note : JS et dates
https://lehollandaisvolant.net/?mode=links&id=20240129192146Que c’est casse gueule, la gestion des dates.
Prenez cet exemple :
date = 30 janvier;
date.lemois = février;
date.lejour = 5 du mois;
Maintenant que contient la date ? On pourrait croire que puisque $date reçoit "février" en mois, puis "5" en jours, elle contient "5 février", mais ce n’est pas le cas.
Voici ce qui se passe :
date = 30 janvier;
date.lemois = février; // → 30 février → 2 mars
date.lejour = 5 du mois; // → 5 mars
Car en mettant "février" sur le mois d’une date située au "30 janvier", JS recalcule le 30 février au 2 mars (le 28/02 + 2 jours, à cause du fait qu’il n’y a pas toujours 30 jours dans un mois — et encore, cette année, ça donnerait même le 1er mars, car 2024 est bissextile).
Parfaitement logique, mais pas moins casse gueule quand on ne fait pas attention.
Une solution :
date = 30 janvier;
date.lejour = 1 du mois; // → 1 janvier
date.lemois = février; // → 1 février
date.lejour = 5 du mois; // → 5 février
Faire un reset du jour avant de changer le mois. J’ai mis le 1, mais j’aurais pu prendre n’importe quelle valeur jusqu’à 28, car 28 est présent dans tous les mois.
Bien sûr, ça c’est si on utilise — comme on doit le faire — l’API des dates de son langage de programmation (JS ici). Si on bricole son propre objet, on n’aura pas le problème…
… par contre on pourra se retrouver avec des 31 févriers.
… et au cas où nous fussions tenté de coder tout de même notre propre gestionnaire de dates : sachez qu’il existe des journées de 90 000 seconds, d’autres de 82 800 secondes, parfois même de 86 401 secondes ! Un événement d’une durée de 23h30 peut aussi s’étendre sur 3 jours distincts.
… donc non, tenez-vous en à une API interne pour ce qui est des calculs sur les dates.
… ah et pas oublier qu’en JS en particulier, les mois vont de 0 à 11, mais que les jours, eux, commencent bien à 1.
BTW, si l’utilisateur de votre outil fait un événement récurrent de façon mensuelle chaque 30 du mois, ce N’EST PAS mon problème si l’événement n’aura pas lieu en février.
(Haha, oui, mes outils de gestion de date sont codés deux fois dans l’année : une fois la veille du changement d’heure, et une autre fois juste avant le février d’une année bissextile… Où est le ffffffffun sinon ?)