
ISO 8601
Il semblerait qu’actuellement, des fonctions de base et censées être évidentes, ne le sont pas. En travaillant sur le nouveau module des horaires, il a été nécessaire de calculer le numéro de la semaine d’une certaine année. Pour cela, un standard existe: ISO 8601. Celui-ci est implanté avec succès dans PHP depuis bien longtemps (PHP 4.1.0). En revanche, si vous voulez travailler sous JS (JavaScript), vous aurez de la peine à trouver un équivalent fiable. Après en avoir testé plusieurs, ils retournaient pour la plupart, des résultats erronés. Voici deux scripts qui permettent de trouver l’année et le numéro de la semaine en format ISO 8601 correct:
En espérant avoir pu aider certains développeurs
Pour information, voici la partie qui explique l’algorithme
Le calcul automatisé du numéro de semaine en informatique reste simple mais néanmoins non trivial, à cause des semaines charnières entre chaque année. Cette réflexion mérite donc d’être partagée.
Dans de nombreux langages de programmation informatiques, les outils comptent les jours de la semaine en partant du dimanche (valeur zéro), puis 1 pour le lundi, jusqu’à 6 pour le samedi. Dans certains pays, la semaine commence le dimanche et, mathématiquement (modulo 7), 0 et 7 reviennent au même dans les tests. Pour l’affichage, cela devient un cas particulier à traiter. Il existe parfois une fonction donnant directement une numérotation normalisée.
Pour écrire une fonction calculant le numéro ISO de la semaine à partir d’une date donnée, il y a différents algorithmes. Cela peut être par exemple :
- Calculer le jeudi de la même semaine que la date cherchée. On calculera le numéro de semaine de ce jeudi pour être sûr de compter dans la bonne année sans test particulier. (Ce jeudi peut tomber l’année précédente ou suivante.)
- Considérer le 4 janvier de la même année que ce jeudi.
- Calculer le lundi de la même semaine que ce 4 janvier (identifiant ainsi le début du comptage; ce lundi peut tomber la même année ou avant)
- Calculer le nombre de jours écoulés entre les deux dates particulières (ce lundi et ce jeudi).
- Ajouter 3 à ce nombre de jours, pour éviter les problèmes d’arrondi, puis diviser par 7. On a le résultat voulu.
Certains algorithmes utilisent des exceptions peu justifiables, voire retournent des valeurs erronées pour certaines dates. L’avantage de l’algorithme précédent est d’être fiable, tout en profitant des fonctions généralement disponibles (le compte des années bissextiles ou du nombre de jours est déjà implanté).
Si on sait J le jour correspondant à une date (de J=1 pour lundi, à J=7 pour dimanche), en adaptant les fonctions existantes si nécessaire, alors le jeudi de la même semaine est situé (J-4) jours plus tôt (ou plus tard si négatif). Le lundi associé est (J-1) jours plus tôt.
Wikipedia - http://fr.wikipedia.org/wiki/ISO_8601
Derniers commentaires..