Qualité des données

Les fuseaux horaires à la demi-heure et à 45 minutes, expliqués

La plupart des développeurs écrivent leur premier code de gestion des fuseaux horaires en supposant que chaque décalage correspond à un nombre entier d'heures par rapport à UTC. Cette hypothèse vaut pour la majorité des fuseaux, puis s'effondre la première fois qu'une requête arrive d'un endroit qui ne la respecte pas. Plusieurs régions du monde utilisent des décalages à la demi-heure, et au moins une région utilise un décalage de 45 minutes, et aucun de ces cas n'est un cas limite au sens de rare ou invalide. C'est simplement la manière dont ces lieux ont choisi de régler leurs horloges par rapport au soleil et à leurs voisins.

Un décalage à la demi-heure reflète généralement la longitude d'un pays située entre deux fuseaux horaires standard, avec la décision de couper la poire en deux plutôt que d'arrondir d'un côté. Un décalage de 45 minutes est encore plus rare et reflète en général une position intermédiaire similaire, combinée au choix délibéré de se distinguer d'un décalage standard voisin. Ni l'un ni l'autre n'est une erreur dans les données. Ce sont deux fuseaux horaires légaux légitimes, suivis de la même manière que n'importe quel fuseau à l'heure entière dans la base de données IANA.

Là où cela casse réellement les logiciels, c'est dans les calculs de date et d'heure qui codent en dur des hypothèses. Un code qui arrondit les décalages à l'heure la plus proche, qui stocke un décalage sous forme de nombre entier d'heures ou qui construit une liste déroulante de fuseaux horaires avec uniquement des incréments d'une heure et d'une demi-heure traitera mal ces fuseaux sans le signaler. L'échec est généralement discret, lui aussi. Les heures seront décalées de quinze ou trente minutes au lieu de déclencher une erreur évidente, ce qui rend le bogue facile à manquer lors des tests et le fait apparaître seulement lorsqu'un vrai utilisateur de la région concernée signale une anomalie.

La solution est simple si vous la prévoyez dès le départ : travaillez toujours avec le décalage UTC réel renvoyé pour un fuseau, exprimé à la minute près, plutôt que de supposer ou d'arrondir à l'heure. Stockez et comparez les noms de fuseaux plutôt que les décalages lorsque c'est possible, puisque le nom porte le décalage exact, actuel et historique, sans que vous ayez à coder quoi que ce soit en dur.

Une recherche de fuseau horaire qui renvoie le décalage précis avec le nom de fuseau IANA supprime toute approximation. Interrogez directement les coordonnées ou le fuseau plutôt que de déduire le décalage d'un lieu à partir de son seul pays ou de sa seule région, car les décalages peuvent varier au sein d'un même pays et s'alignent rarement proprement sur l'heure partout.