Première rédaction de cet article le 2 juillet 2012
Dernière mise à jour le 6 juillet 2012
La grande panne de nombreux serveurs Linux le 1er juillet a remis sur le tapis la question des secondes intercalaires. S'il y a toujours des bogues aussi sérieuses dans le code qui les gère, ne faudrait-il pas supprimer le problème en simplifiant l'échelle de temps UTC, par la suppression de ces secondes intercalaires ?
D'abord, il faut établir clairement les responsabilités : ce comportement anormal de Linux (le meilleur article technique est celui de ServerFault, très détaillé) est une bogue. Quarante ans après la création des secondes intercalaires, il est anormal qu'il reste encore de telles bogues dans un programme répandu, alors qu'il y a déjà eu 25 secondes intercalaires, donc plein d'occasions de tester.
Ensuite, le problème n'est pas dans UTC ou dans les secondes intercalaires. Le problème est dans la Terre qui ne « tourne pas rond ». Son mouvement n'est pas constant et, pire, il n'est pas prédictible. Lorsque certains articles anti-secondes-intercalaires ont écrit « il n'est pas normal qu'on ne puisse pas calculer le temps à l'avance », ils disent une grosse bêtise. Normal ou pas, c'est ainsi que le monde réel fonctionne.
Comme on ne peut pas « patcher » la Terre, que reste-t-il comme solutions ? Les adversaires de la seconde intercalaire proposent de supprimer cette dernière d'UTC. Mais je trouve cette « solution » tout à fait inutile. Il existe déjà une échelle de temps sans secondes intercalaires et c'est TAI ! Supprimer les secondes intercalaires revient à aligner UTC sur TAI, faisant perdre l'intérêt qu'il y a à avoir deux échelles :
Les deux ont leur légitimité et leur utilité. Les gens qui réclament la suppression des secondes intercalaires pour simplifier les programmes n'ont tout simplement pas compris cela. (TAI a actuellement 35 secondes de décalage avec UTC, si bien qu'on ne voit pas encore de conséquences pratiques.)
Mais, me dira-t-on, UTC, avec ses secondes intercalaires, est bien compliqué pour des programmes qui souhaitent avoir une horloge monotone et prévisible (comme les bases de données réparties, les grandes victimes de la panne). Dans ce cas, la solution est d'utiliser TAI. Hélas, sur Unix, la situation est compliquée. Il n'y a pas de moyen simple d'accéder à TAI. Quelques solutions possibles :
CLOCK_MONOTONIC
(voir la
définition de clock_gettime()) qui n'est pas vraiment TAI et ne
semble pas beaucoup mise en œuvre.leapseconds
, et qu'elle est correcte ; pourquoi diable libtai ne l'utilise pas ?).Alain a aussi produit un script simple pour fabriquer une table des décalages UTC-TAI à partir du registre des temps à l'IANA. Voici comment on peut l'utiliser. D'abord, exécuter de temps en temps (pour mettre à jour le fichier), par exemple depuis cron :
% cd /usr/share/zoneinfo % perl /usr/local/sbin/gentai.pl Zonefile ./tai generated Zonefile ./tai compiled in Etc/TAI You can check with "TZDIR=/usr/share/zoneinfo TZ=Etc/TAI date && TZ=UTC date" Leapsecond file ./leapseconds_iana saved
Ensuite, lorsque vous avez envie de voir le temps TAI, vous définissez juste la variable d'environnement qui va bien :
% TZ=Etc/TAI date && date -u Fri Jul 6 21:00:16 TAI 2012 Fri Jul 6 20:59:41 UTC 2012
Vous voyez bien les trente-cinq secondes de décalage actuels.
À noter que cette idée d'avoir deux échelles, TAI et UTC, qui reconnait le fait qu'il y a deux populations d'utilisateurs, avec des besoins différents, est rejetée par le BIPM qui considère que deux, c'est trop, à cause du risque de confusion.
Autres lectures :
Remerciements à Steve Allen, Tony Finch, Pierre Beyssac, Alain Thivillon et Peter van Dijk pour la discussion sur TAI dans Unix. Merci à Kim-Minh Kaplan pour le rappel qu'UTC ne va jamais en arrière, c'est Unix (ou d'autres systèmes) qui le fait, ne sachant pas gérer la seconde intercalaire.
Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)
Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)