Heure Unix

L'heure Posix est une mesure du temps utilisée essentiellement dans les dispositifs qui respectent la norme POSIX, d'où son nom.



Catégories :

Unix - Mesure du temps - Mesure physique - Métrologie

Page(s) en rapport avec ce sujet :

  • L'heure unix est un dispositif répandu de calcul du temps basé sur le nombre de secondes depuis l'epoch unix : le 1er janvier 1970 à 00 :00 UTC.... (source : forum.framasoft)
  • Au moment où j'écris cette phrase, l'heure Unix est 1100018846 (tiens, ... UTC est particulièrement simple, il y a précisément 60×60×24 secondes par jour, et elle ... (source : frameip)

L'heure Posix (aussi nommée POSIX timestamp) est une mesure du temps utilisée essentiellement dans les dispositifs qui respectent la norme POSIX[1], d'où son nom. Il s'agit du nombre de secondes écoulées depuis le 1er janvier 1970 00 :00 :00 UTC jusqu'à l'événement à dater, hors secondes intercalaires (voir ci-dessous). C'est la représentation POSIX du temps.

L'heure UNIX est rencontrée sur les dispositifs de type UNIX[1] qui respectent généralement cette norme POSIX.

Heure POSIX

Ce graphe montre la différence DUT1 entre UT1 et UTC. Les segments verticaux correspondent à l'insertion de secondes intercalaires.

Associer un événement dans le temps à un nombre réel

Pour associer un événement à un nombre réel, il suffit d'utiliser des références naturelles et universelles : par exemple, les périodicités de rotation de la Terre sur elle-même, et autour du Soleil. Ces périodicités sont suffisantes pour établir des calendriers, c'est-à-dire des relations entre des événements et des dates, même si quelques efforts sont nécessaires pour bien définir les références utilisées[2] (chaque pays a les siennes, toutes adoptées à des instants différents)  ; les dates de ces calendriers ne sont que des nombres exprimés dans un système de numération légèrement compliqué qui a pour unités le jour, la semaine, le mois, la saison, l'année, etc., et l'heure Posix n'est qu'une référence parmi d'autres exprimée sous forme d'un simple nombre.

Principaux dispositifs de mesures utilisés

Voici les principaux dispositifs de mesure du temps qui ont été imaginés et utilisés jusqu'à nos jours[3] :

Sigle Signification Définition
GMT Temps
Moyen de
Greenwich[4]
Encore en usage dans certains pays pour des aspects légaux[5].

Néanmoins la définition de ce dispositif de mesure est ambigüe[4]. C'est pourquoi, en dehors de cet usage administratif, il est préférable d'utiliser UTC.

UT Temps
Universel
Ce dispositif définit le jour comme la durée moyenne de rotation de la Terre autour de son axe.

Cette définition pose quelques difficultés car la vitesse de cette rotation n'est pas constante, elle diminue lentement sous l'effet des marées et , qui plus est , présente des irrégularités imprévisibles : la durée des jours UT augmente particulièrement lentement en moyenne (de l'ordre de la seconde sur une à trois années).

On peut distinguer plusieurs versions de UT : UT0, UT1, UT1R, UT2. On se reportera à l'article «Temps universel» pour plus de détails.

TAI Temps
Atomique
International
Ce dispositif est basé sur une définition internationale de la seconde. Son étalon est constitué par plusieurs horloges atomiques réparties dans le monde. La mesure du temps dans ce dispositif est strictement régulière à la différence de la précédente pour qui son étalon n'a pas la même régularité. En conséquence, TAI et UT s'éloigne progressivement l'un de l'autre du fait du ralentissement du second.
  • Une différence de deux TAI sert à calculer un délai écoulé de façon exacte.
UTC Temps
Universel
Coordonné

Ce dispositif est adopté comme base du temps civil international par la plupart de pays. Le mot «coordonné» indique que :

  • la différence entre UTC et TAI est un nombre entier de secondes,
  • la différence entre UTC et UT1 n'est jamais plus grand que 0, 9 seconde.

C'est à dire, UTC est semblable au TAI (il en a la stabilité et l'exactitude) à un nombre entier de secondes près[6], ce qui lui sert à coller à UT à 0, 9 s près ; c'est ce que montre la figure ci-contre[7].

  • Le respect de cet écart maximal entre UT et UTC est garanti par l'«International Earth Rotation and Reference Systems Service» (IERS), basé surtout à l'Observatoire de Paris, qui décide[8] de rajouter (ou supprimer) des secondes intercalaires chaque fois que UTC et UT s'écartent trop l'un de l'autre.
  • Une différence de deux heures UTC sert à calculer un délai écoulé de façon exacte tant que les deux événements ne sont pas à cheval sur une seconde intercalaire (voir ci-dessous la probabilité et l'amplitude de l'erreur). Pour calculer un délai exact en toutes circonstances, il faut tenir compte des secondes intercalaires[9].

Choix d'une origine du temps

Pour mesurer le temps, il faut choisir une origine :

Évolution du temps

Il faut indiquer comment évolue ce nombre selon le temps qui passe :

Tableau 1 : L'heure Posix au passage de minuit quand une seconde intercalaire fut ajoutée le 31 décembre 2008 à minuit
# TAI UTC TAI - UTC Heure Posix
1 2009-01-01T00 :00 :30 2008-12-31T23 :59 :57 33 1 230 767 997
2 2009-01-01T00 :00 :31 2008-12-31T23 :59 :58 33 1 230 767 998
3 2009-01-01T00 :00 :32 2008-12-31T23 :59 :59 33 1 230 767 999
4 2009-01-01T00 :00 :33 2008-12-31T23 :59 :60 33 1 230 768 000 ajout d'une seconde intercalaire[12]
5 2009-01-01T00 :00 :34 2009-01-01T00 :00 :00 34 1 230 768 000
6 2009-01-01T00 :00 :35 2009-01-01T00 :00 :01 34 1 230 768 001
7 2009-01-01T00 :00 :36 2009-01-01T00 :00 :02 34 1 230 768 002

L'Heure Posix n'est pas une représentation linéaire du temps, il y a des anomalies[12], comme par exemple la ligne 5 du tableau ci-dessus.

Il n'y a pas correspondance bijective entre l'heure UTC et l'heure Posix ; ce dernier ne permet pas de représenter les secondes intercalaires présentes dans UTC, comme par exemple la ligne 4 du tableau ci-dessus : 2008-12-31T23 :59 :60 UTC.

Temps écoulé entre deux événements

Il ne faut pas mélanger ces différentes références (par exemple, l'an zéro d'un calendrier ne débute pas au même instant que celui d'un autre) et aussi parce que tous ces calendriers ont besoin de s'adapter aux périodicités non multiples les unes des autres, par exemple les années bissextiles, ou bien les irrégularités de ces périodicités. Ces adaptations compliquent un petit peu les calculs, selon la précision qu'on recherche ; par exemple, il s'est écoulé un an peut être une information suffisante ou bien il faudra tenir compte du caractère bissextile de l'année pour répondre à la même question exprimée en nombre de jours. Cela veut dire qu'il faut conserver une mémoire du passé, la mémoire de chaque seconde qui passe.

Dans la majorité des cas, une simple différence des heures Posix suffit, sauf si les deux événements sont à cheval sur une ou plusieurs secondes intercalaires. Pour calculer un délai exact en toutes circonstances, il faut tenir compte des secondes intercalaires.

Cependant, l'occurrence des secondes intercalaires est faible[13], la probabilité de commettre une telle erreur est par conséquent faible ; et si malgré tout le cas se produit, alors l'amplitude de l'erreur est peut-être faible[14], et il n'y a dans ce cas pas besoin de se préoccuper de ces secondes intercalaires ; le tableau ci-dessous montre différents exemples.

La méthode pour compléter une ligne de ce tableau est la suivante :

L'application de cette méthode pour des délais M=10, 100, 1000 donne le tableau suivant :

Tableau 2 : Erreur commise et probabilité de commettre l'erreur
Délai à mesurer (M) Probabilité d'erreur Amplitude de l'erreur
10 s 3, 2×10-7 10%
100 s 3, 2×10-6 1%
1 000 s 3, 2×10-5 0, 1%

À la limite, si le délai à calculer entre les 2 événements d'intérêt est d'un an, alors la probabilité est de 100% de commettre une erreur de 3, 2×10-8.

La probabilité de commettre une erreur donnée et l'amplitude de cette erreur fluctue inversement l'une de l'autre ; une autre façon de présenter les choses pourrait être de dire :

Si ce couple (probabilité de commettre une erreur / amplitude de l'erreur) est intolérable, ou bien si on ne sait pas en évaluer l'impact, alors il est sûrement indispensable de se poser la question de savoir pourquoi on utilise UTC et quel est le besoin de précision indispensable, ou bien de prévoir l'usage de tables à mettre à jour dès que l'insertion/retrait d'une seconde intercalaire est programmée[8], [15].

Conversion de l'heure UTC en heure Posix

Hormis les particulièrement rares anomalies mentionnées auparavant à propos des secondes intercalaires, il est aisé de convertir une heure UTC en une heure Posix et vice versa.

Exemple : Quelle est l'heure Posix en tout début de la journée du 1er janvier 2010 :

Tableau 3 : Calcul du nombre de jours écoulés entre 1er janvier 1970 et 1er janvier 2010
Nombre de jours écoulés
1 970 1 971 1 972 1 973 3*365+366 = 1461
1 974 1 975 1 976 1 977 1461
1 978 1 979 1 980 1 981 1461
1 982 1 983 1 984 1 985 1461
1 986 1 987 1 988 1 989 1461
1 990 1 991 1 992 1 993 1461
1 994 1 995 1 996 1 997 1461
1 998 1 999 2 000 2 001 1461
2 002 2 003 2 004 2 005 1461
2 006 2 007 2 008 2 009 1461
14 610

Il existe aussi des outils[17] qui exécutent ces calculs particulièrement simplement, comme par exemple ce script bash pour convertir un nombre de secondes depuis l'époque Posix en une date :

        #!/bin/bash
        # convertir un nombre de secondes depuis l'époque Posix 
        #           en date
        # exemple: date -u -R --date "1970-01-01 1230768000 seconds"
        date -u -R --date "1970-01-01 ${*} seconds" 

Conversion d'une heure Posix en heure UTC

Le calcul inverse ne présente pas de difficulté, et de la même façon il existe des outils[17] qui exécutent ces calculs particulièrement simplement, comme par exemple ce script bash pour convertir une date en un nombre de secondes depuis l'époque Posix :

        #!/bin/bash
        # convertir une date (attention au format de l'argument)
        #           en nombre de secondes depuis l'époque Posix
        # exemple: date --date "2009-01-01 00:00:00+00:00" "+%s"
        date --date "${*}" "+%s"

Heure UNIX

Nombre limité d'années qu'un dispositif UNIX spécifique peut représenter

La méthode plus courante pour lire l'heure sous Unix, est l'appel à la fonction suivante qui retourne une valeur numérique de type "time_t".

        time_t time(NULL);

Ce type time_t est fréquemment utilisé pour manipuler l'heure UNIX, malheureusement la norme POSIX n'en précise pas (clairement) la taille :

Illustration du phénomène de débordement.
Quand cette date la plus avancée sera franchie, cette représentation va déborder   (en) , c'est-à-dire qu'elle ne sera plus capable de continuer à représenter l'heure Unix correctement. Ce problème est nommé le bug de l'an 2038. L'image animée ci-contre illustre le phénomène de débordement.
Heure Unix UTC
date la plus reculée : -231 -2 147 483 648 1901-12-13 T 20 :45 :52
époque Unix : 0 0 1970-01-01 T 00 :00 :00
date la plus avancée : 231-1 2 147 483 647 2038-01-19 T 03 :14 :07

Cette impossibilité de représentation ne met pas nécessairement en cause le fonctionnement de la machine elle-même, c'est-à-dire le fonctionnement de son système d'exploitation[18] mais le fonctionnement de ses applications et son interopérabilité avec les autres machines. En effet, il n'est pas suffisant qu'une machine sache localement gérer cette limite, mais il faut aussi que l'ensemble des machines qui lui sont connectées[19] soient capables de gérer cette limite et ce de la même façon.

Plusieurs cas peuvent se présenter :

  1. soit on a affaire à un parc de machines bien maitrisées, c'est le cas par exemple des dispositifs embarqués. Dans ce cas, une solution pour gérer cette frontière peut être de s'assurer que le parc de machines n'utilise que des applications développées particulièrement pour être robustes face à cette situation[20], [21],
  2. soit on a affaire à un parc de machines particulièrement hétérogènes et non maitrisées, c'est le cas par exemple des machines du monde entier qui sont connectées sur internet. Dans ce cas, une solution serait de généraliser le codage de cette heure Unix sur 64 bits à l'ensemble des machines, y compris celles en 32 bits. On peut aussi raisonnablement espérer que l'ensemble des machines seront au moins 64 bits à l'aube de 2038.

Utilisation d'une résolution inférieure à la seconde

Les dispositifs Unix entretiennent généralement un compteur dont la résolution est plus fine que la seconde. Cette heure est accessible par un appel à la fonction suivante :

        int gettimeofday(struct timeval *tv, NULL);

La valeur numérique retournée par cette fonction est mémorisée dans la variable «struct timeval *tv» définie de la façon suivante :

        struct timeval {
                int    tv_sec;     /* secondes */
                int    tv_usec;    /* microsecondes de 0 à 999 999 */
        };

L'emploi de cette résolution inférieure à une seconde amène la question de savoir ce qui se passe quand une seconde intercalaire est ajoutée ou retranchée ? Il semblerait que ce point soit à la charge du dispositif d'exploitation[22]. En l'absence de spécification claire, plusieurs scénarios sont par conséquent envisageables selon le dispositif d'exploitation reconnu[23]. Les trois exemples ci-dessous exposent les trois catégories de cas qui semblent les plus représentatives, ils ne traitent que l'aspect insertion d'une seconde intercalaire mais ils pourraient aisément être adaptés au cas de la suppression :

Heure ajustée brutalement
# UTC tv_sec tv_usec
4 2008-12-31T23 :59 :60.000 1 230 768 000 0
2008-12-31T23 :59 :60.500 1 230 768 000 500 000
5 2009-01-01T00 :00 :00.000 1 230 768 000 0 heure ajustée brutalement
2009-01-01T00 :00 :00.500 1 230 768 000 500 000
6 2009-01-01T00 :00 :01.000 1 230 768 001 0
Heure figée
# UTC tv_sec tv_usec
4 2008-12-31T23 :59 :60.000 1 230 768 000 0
2008-12-31T23 :59 :60.500 1 230 768 000 0 heure figée
5 2009-01-01T00 :00 :00.000 1 230 768 000 0 heure figée
2009-01-01T00 :00 :00.500 1 230 768 000 500 000
6 2009-01-01T00 :00 :01.000 1 230 768 001 0
Heure ralentie
# UTC tv_sec tv_usec
4 2008-12-31T23 :59 :60.000 1 230 768 000 0
2008-12-31T23 :59 :60.500 1 230 768 000 250 000 heure ralentie
5 2009-01-01T00 :00 :00.000 1 230 768 000 500 000 heure ralentie
2009-01-01T00 :00 :00.500 1 230 768 000 750 000 heure ralentie
6 2009-01-01T00 :00 :01.000 1 230 768 001 0

Utilisation du TAI

L'idée d'utiliser le Temps atomique international a déjà été proposée et défendue par de nombreuses personnes[25], mais ce n'est pas le sens qui a été donné par l'histoire, le choix retenu fut celui qui actuellement est figé par la norme POSIX.

Daniel J. Bernstein a aussi écrit des articles et logiciels[21] pour l'utilisation de TAI sur des dispositifs de type UNIX.

Notes et références

  1. POSIX est une marque déposée de «IEEE» ; UNIX est une marque déposée de «The Open Group».
  2. On pourra aussi consulter (en) Epoch time vs. time of day pour une discussion sur certains aspects légaux, et aussi les autres pages de ce site ; surtout (en) Plots of deltas between time scales pour comparer les écarts entre différentes références.
  3. Il ne faudrait pas penser que cette liste est aussi courte, on pourra consulter (en) Time Scales pour une liste plus exhaustive et précise.
  4. L'utilisation de l'ancienne appellation standard «temps moyen de Greenwich» (GMT, de l'anglais «Greenwich Mean Time») est désormais déconseillée parce que sa définition est ambigüe, au contraire d'UTC, qui doit lui être préférée. Ce sigle s'était imposé par la prépondérance de la marine britannique durant le XIXe siècle et fut plus tard rebaptisé Temps universel (UT, de l'anglais Universal Time). Comme le temps UTC est le temps civil du méridien origine des longitudes à Greenwich, certains ont tenté de prolonger l'usage de GMT en le traduisant désormais par «Greenwich Meridian Time» mais ce glissement sémantique n'a aucune valeur officielle.
  5. Voir l'article (en) Greenwich Mean Time| l'utilisation de GMT dans la législation.
  6. Dans l'échelle UTC, les secondes et l'ensemble des autres sous-multiples (milliseconde, microseconde, etc. ) sont de durée constante, mais la minute et l'ensemble des unités supérieures (heure, jour, semaine, etc. ) sont de durée variable. L'ajout ou la suppression de ces secondes intercalaires est rare, de l'ordre d'une seconde sur une à trois années. La majorité des jours UTC comportent 86 400 secondes, la majorité des heures 3 600 secondes, et la majorité des minutes 60 secondes mais certains peuvent comporter respectivement 86 401 s ou bien 86 399 s, 3 601 s ou bien 3 599 s et 61 s ou bien 59 s.
  7. Si on traçait sur un graphique identique la différence entre UT1 et TAI, on verrait UT1 et TAI s'éloigner progressivement l'un de l'autre au rythme du ralentissement de la rotation de la Terre ; de même, on verrait UTC et TAI s'éloigner l'un de l'autre par bons successifs au rythme de l'ajout/suppression des secondes intercalaires.
  8. Cet ajout (ou suppression) a lieu soit la fin de la dernière minute du dernier jour du mois précédant le 1er juillet ou le 1er janvier, exceptionnellement cela peut être le 1er avril ou le 1er octobre, et est annoncé 6 mois à l'avance par l'IERS via son (en) BULLETIN C - Product metadata. En mars 2009, il n'y a jamais eu de suppression de secondes intercalaires, et probablement il n'y en aura jamais compte tenu du fait que la vitesse de rotation de la terre diminue inexorablement. Il pourra être intéressant de consulter les autres bulletins de l'IERS (en) IERS Bulletins.
  9. Les secondes intercalaires futures sont prévues avec une anticipation de six mois au maximum, c'est le rythme à lequel l'IERS diffuse son bulletin de prévision. Pour les valeurs passées on peut faire usage d'une table.
  10. Il y a une difficulté avec cette définition, dans le sens que UTC n'existait pas avant 1972 ; cette difficulté est contournée en utilisant des nombres négatifs pour une date antérieure à l'époque ; ainsi 04-10-1957T00 :00 :00Z, 4 472 jours avant l'époque, est représenté par l'heure POSIX -4 472 × 86 400 = -386 380 800.
  11. Voir Leap Seconds.
  12. Un PC ne va pas spontanément ralentir/accélérer son compteur interne par lui-même ; l'ajustement peut être fait par l'utilisateur ou énormément plus probablement, s'il est connecté à internet, de façon automatique et quasi-silencieuse par un service d'horloge, le plus souvent il s'agit de NTP.
  13. Le graphique ci-dessus montre que la période d'insertion d'une seconde intercalaire est entre une et trois années.
  14. Plus le délai est grand et plus l'impact d'une seconde d'erreur est faible et vice versa.
  15. Pour que cette dernière méthode soit utilisable à bord d'un dispositif embarqué, cela nécessiterait la mise en œuvre d'une mise à jour automatique et en temps réel de la table.
  16. Une années est bissextile si elle est multiple de 4, mais non multiple de 100 sauf si multiple de 400 (exemple, 2000 était bissextile). L'application de cette règle montre qu'il est suffisant de tester la divisibilité par 4 entre 1901 et 2099.
  17. Voir par exemple ce (en) Convertisseur secondes / date.
  18. A titre d'exemple, le dispositif d'exploitation Linux continue à fonctionner au-delà de cette date la plus avancée.
  19. Il faut comprendre le mot connecté au sens large, cela concerne la connexion ethernet, mais également l'échange de fichiers via des disques amovibles pour lesquels la datation des fichiers est un point important, pour les sauvegardes par exemple.
  20. On pourra consulter avec intérêt le (en) site web dédié à la dissémination de l'information à propos du bug de l'année 2038 qui apporte une solution pour fonctionner jusqu'en 2106, autant sur les machines 32 bits que 64 bits.
  21. On pourra aussi considérer l'usage du TAI et consulter avec intérêt les articles rédigé par D. J. Bernstein à ce sujet :
  22. Voir (en) The NTP Timescale and Leap Seconds.
  23. Un article (en) Leap Second Handling by Operating Systems expose 3 cas envisageables. Il est dit : «Linux kernels and most other Unix-like systems care about the leap seconds and handle them correctly. » mais sans réellement préciser ce que correctly veut dire au juste.
  24. Comme exemple pour évaluer l'impact de ces différents scénarios, on pourrait imaginer un instrument de mesure de vitesse qui mesure le délai écoulé pour une distance parcourue donnée : dans le 3e cas, la vitesse sera surestimée, au maximum dans un rapport 2, et dans les deux premiers cas d'un rapport qui pourra être illimité. On se rappellera tout de même que la probabilité d'occurrence d'un tel phénomène est rarissime, voir plus haut
  25. Voir surtout (en) History of IEEE P1003.1 POSIX time by Landon Curt Noll   (en) .

Voir aussi

Liens externes

Bibliographie

Recherche sur Amazon (livres) :



Principaux mots-clés de cette page : secondes - heure - utc - posix - intercalaires - temps - 230 - dispositifs - 2009 - unix - 01t00 - 768 - erreur - nombre - tai - time - jour - 2008 - machine - dates - délai - probabilité - 31t23 - tableau - 1461 - 500 - événement - dire - bits - différence -

Ce texte est issu de l'encyclopédie Wikipedia. Vous pouvez consulter sa version originale dans cette encyclopédie à l'adresse http://fr.wikipedia.org/wiki/Heure_Unix.
Voir la liste des contributeurs.
La version présentée ici à été extraite depuis cette source le 11/11/2010.
Ce texte est disponible sous les termes de la licence de documentation libre GNU (GFDL).
La liste des définitions proposées en tête de page est une sélection parmi les résultats obtenus à l'aide de la commande "define:" de Google.
Cette page fait partie du projet Wikibis.
Accueil Recherche Aller au contenuDébut page
ContactContact ImprimerImprimer liens d'évitement et raccourcis clavierAccessibilité
Aller au menu