Niveau :
Résumé : zdump ; zic
Le temps est absolu
Le temps est quelque chose de sensible. Si mon serveur est en retard il va croire que la personne qui vient de s'authentifier sur mon site essaie de me flouer en me donnant une date invalide. S'il est en avance, il va croire qu'il n'est pas venu depuis longtemps et va le déconnecter.
Il est donc important d'être toujours à l'heure, car l'heure c'est l'heure et quand il est pas encore l'heure c'est pas l'heure et s'il n'est plus l'heure ce n'est toujours pas l'heure. Vous me suivez ?
Mais pour une fois je ne vais pas vous parler de l'heure selon NTP, mais l'heure selon Saint Matthieu, enfin presque.
Supposons que, grâce à votre professionnalisme, votre machine soit à l'heure, voire à la seconde, grâce à NTP. Supposons que vous vouliez connaitre cette heure. Que faites-vous ? Vous la demandez au noyau (via time ou gettimeofday), et il vous la donne en UTC ...
Mais en pratique vous voulez l'heure de chez vous, celle qui dit que le soleil va se coucher dans la belle province. Bien sûr la libc va faire la conversion pour vous (via localtime, mais voyons comment elle fait.
Enfin presque
La date et l'heure s'expriment de plusieurs façons. L'heure UTC est la version "absolue"', c'est à dire qu'elle ne dépend pas des différentes régions de la planète où l'on se place. Mais tous les pays ne l'entendent pas de cette oreille et veulent chacun définir leur heure. Définition qui peut changer dans le temps ...
Pour faire la conversion, il faut donc connaître toutes ces règles. Heureusement des acharnés on fait ce travail de récupération et les ont déposées dans /usr/share/timezone sur le système de fichier.
Vous croyez qu'il n'y à que 24 fuseaux horaires ? Faux il y en a un peu plus. Maintenant comptons les timezone :
$ find /usr/share/zoneinfo/ -type f | wc -l 1764
Imaginez le temps qu'il a fallu pour compiler ces données ...
Vous constaterez que ce sont des fichiers binaires. La libc les lit directement (pour en savoir un peu plus, man tzfile et man tzset), mais pour nous humains ? On utilise zdump
$ zdump -v Europe/Paris
Vous y verrez les changements d'heure une seconde avant et une seconde après chaque changement. Remarquez qu'il y a plus d'information dans le binaire que dans le dump qui ne fait qu'afficher les dates de saut temporel.
Pas du tout
Mais aujourd'hui est un grand jour, je vais faire ma propre nation (une de plus). J'y édicterai un nouvel horaire, UTC+1,25 et heure d'été en UTC +0,75. Le changement se fera à MON anniversaire.
Il faut donc que je crée un fichier de zone correspondant à mon pays. Prenons le source suivant :
# règles de changement d'heure Rule peck 2010 max odd Mar 6 4:00 -0:30 - Rule peck 2010 max odd Sep 6 4:00 0 - # définition de l'heure standard dans la zone Zone peck 1:15 peck PCK
Et on le compile avec zic :
# notez que j'ai récupéré yearistype dans le source de tzdata # il permet l'usage de odd dans mon fichier de règles $ /usr/sbin/zic -d . -y "sh yearistype.sh" peck
Il suffit maintenant de le déposer dans /usr/share/timezone et voilà ce qu'on peut obtenir :
$ TZ=peck LC_TIME=C date Mon Mar 7 17:48:02 PCK 2011 # notez la différence (UTC+x et PCK) $ TZ=peck LC_TIME=fr_FR date lundi 7 mars 2011, 17:48:37 (UTC+0045)
Votre timezone perso !
Pour des exemples complets et complexes de zones, vous pouvez regarder le source du paquet tzdata. C'est votre référence, mais je doute que vous ayez à y toucher prochainement !
Comments