Chapitre 3.3
UTC et les fuseaux horaires
L'un des pièges les plus courants dans lequel tombent les développeurs travaillant sur des dates : ils oublient d'enregistrer ou de transmettre le fuseau horaire. Ça les amène à comparer deux dates qui n'ont pas le même référentiel. Les conséquences peuvent être terribles dans certains secteurs d'activité.
UTC - Temps Universel Coordonné
Pendant des siècles, l'heure était basée sur le temps moyen de rotation de la Terre.
L'observatoire royal de Greenwich faisait référence en la matière. L'usage de leurs cartes par la marine britannique,
la plus influente de l'époque, a permis à Londres d'imposer le méridien de Greenwich comme longitude 0.
Ainsi est né GMT, l'heure du méridien de Greenwich. Le soleil y atteint son point culminant à 12h GMT.
GMT devient officiellement la référence mondiale des fuseaux horaires en 1884.
La rotation de la Terre n'étant pas constante, GMT a été progressivement remplacé comme référence scientifique et technique par un système plus précis : UTC.
UTC conserve le méridien de Greenwich comme référence géographique, mais utilise une méthode de calcul totalement différente.
Depuis 1967, la seconde est définie comme la durée de 9 192 631 770 oscillations de l'atome de césium 133.
Le Temps Universel Coordonné s'appuie sur un réseau mondial d'horloges atomiques qui mesurent cette fréquence.
Afin de garder une synchronisation entre ce système atomique et l'heure solaire, des secondes intercalaires sont occasionnellement ajoutées.
Les traditions ayant la vie dure, le terme GMT est toujours utilisé dans de nombreuses industries.
Pour simplifier les choses, sa définition a toutefois changé : GMT = UTC.
Depuis les années 40, les militaires utilisent le terme "Zero meridian" pour désigner le méridien de Greenwich.
Dans l'alphabet phonétique de l'OTAN, Z se prononce Zulu.
L'heure associée au méridien, l'heure zéro, est ainsi devenue "l'heure Zulu".
C'est pourquoi, dans nos systèmes informatiques, on retrouve la lettre Z dans certains formats de date.
UTC, GMT et Zulu sont de nos jours des termes interchangeables.
Les fuseaux horaires locaux
Le monde est divisé en fuseaux horaires, en anglais timezones, chacun exprimé par un décalage par rapport à UTC. Par exemple en hiver :
- UTC+0 : Londres, Abidjan
- UTC+1 : Paris, Berlin
- UTC−5 : New York
En été, à cause des changements d'heure, la différence avec UTC est modifiée pour certaines régions.
Paris passe ainsi en UTC+2.
Greenwich, comme le reste du Royaume-Uni, passe en UTC+1. Autrement dit, en été, puisque par définition GMT = UTC, le
Greenwich Meridian Time n'est plus égal à l'heure qu'il est effectivement à Greenwich.
Pour éviter des calculs compliqués qui dépendent de la date, chaque ville référente se voit assigner un nom de fuseau.
Si, dans un système informatique, je veux connaître l'heure de Paris, je vais ainsi simplement demander l'heure de la timezone
"Europe/Paris". Pour l'heure de Fort-de-France, ce serait "America/Martinique".
Les changements d'heure n'ont pas de logique universelle, ils sont influencés par des décisions politiques.
Pour savoir l'heure actuelle d'un fuseau et connaître les changements d'heure, les systèmes informatiques
utilisent des bases de données publiques et communautaires comme tzdata.
Tzdata est actualisée plusieurs fois par an.
Nos ordinateurs, lors des mises à jour, en téléchargent une copie.
Sur MacOS et Linux, tu peux la retrouver dans /usr/share/zoneinfo.
zdump -v Europe/Paris | less
Les changements d'heure sont des événements importants en informatique. Ils sont la raison pour laquelle nous évitons de planifier des scripts entre 2h et 3h. Nous évitons ainsi que le script ne s'exécute pas lors du passage à l'heure d'été et s'exécute deux fois lors du passage en heure d'hiver.
Intégrer le fuseau dans le format
Dans le chapitre sur les timestamps, nous avons abordé la norme ISO 8601 et le format "2025-05-03 23:41:25". Pour qu'une date soit interprétée correctement et sans ambiguïté lors d'échanges entre systèmes, ISO 8601 inclut aussi le fuseau horaire.
- 2025-05-03T18:45:21Z : heure UTC, notée avec le Z pour Zulu
- 2025-05-03T20:45:21+02:00 : l'heure locale est à UTC+2
- 2025-05-03T12:45:21−05:00 : l'heure locale est à UTC−5
Dans l'industrie, nous croisons régulièrement d'autres formats de dates.
Par exemple, les dates d'expiration des cookies s'écrivent "Sat, 03-May-2025 18:45:21 GMT".
Quel que soit le format utilisé, rares sont les technologies qui ne permettent pas de préciser des fuseaux horaires.
Il reste tout de même quelques irréductibles dans notre quotidien de développeur.
C'est notamment le cas de MySQL, pourtant l'une des bases de données les plus répandues au monde.
