Loading AI tools
référentiel informatique de mesure du temps De Wikipédia, l'encyclopédie libre
L'heure Unix ou heure Posix est une mesure du temps fondée sur le nombre de secondes écoulées depuis le 00:00:00 UTC, hors secondes intercalaires. Elle est utilisée principalement dans les systèmes qui respectent la norme POSIX[1], dont les systèmes de type Unix, d'où son nom. C'est la représentation POSIX du temps.
NB: cette date du « 00:00:00 UTC » est appelée « époque Unix ».
La définition ci-dessus signifie que l'heure Unix ou heure Posix n'est pas égale à la durée exacte en secondes qui s'est écoulée depuis l'« époque Unix »[2]. Pas plus d'ailleurs que la date et heure UTC ne permettent non plus de calculer cette durée exacte.
Dans les deux cas, pour obtenir le décompte exact des secondes qui se sont écoulées depuis l'« epoch Unix », il faut se procurer une table des secondes intercalaires[3], et il faut ajouter à l'heure Posix la somme arithmétique des secondes intercalaires qui ont été insérées, ou bien retranchées, depuis cette « epoch Unix ».
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[4] (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 un peu 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.
Voici les principaux systèmes de mesure du temps qui ont été imaginés et utilisés jusqu'à nos jours[5] :
Sigle | Signification | Définition |
---|---|---|
GMT | Temps moyen de Greenwich[6] | Encore en usage dans certains pays pour des aspects légaux[7].
Néanmoins la définition de ce système de mesure est ambigüe[6]. C'est la raison pour laquelle, en dehors de cet usage administratif, il est préférable d'utiliser UTC. |
UT | Temps universel | Ce système 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, de plus, présente des irrégularités imprévisibles : la durée des jours UT est très légèrement supérieure, en moyenne, à 86 400 secondes (nombre de secondes dans 24h). L'écart est de l’ordre de la seconde sur une à trois années. On distingue 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 système est fondé 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 système 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'éloignent progressivement l'un de l'autre du fait du ralentissement du second; c'est ce que montre la figure ci-dessus.
|
UTC | Temps universel coordonné |
Ce système est adopté comme base du temps civil international par un grand nombre de pays. Le mot « coordonné » indique que :
Autrement dit, UTC est identique au TAI (il en a la stabilité et l’exactitude) à un nombre entier de secondes près[8], et les secondes intercalaires lui permettent de coller à UT à 0,9 s près ; c'est ce que montre la figure ci-dessus[9].
|
Pour mesurer le temps, il faut choisir une origine :
Il faut indiquer comment évolue ce nombre en fonction du temps qui passe :
# | 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[14] |
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[14], comme 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 la ligne 4 du tableau ci-dessus : 2008-12-31T23:59:60 UTC.
Il ne faut pas mélanger ces différentes références (par exemple, l'an zéro d'un calendrier ne commence pas au même instant que celui d'un autre) et également 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, en fonction de la précision que l'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 plupart 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.
Toutefois, l'occurrence des secondes intercalaires étant faible[15], la probabilité de commettre une telle erreur est donc faible ; et si malgré tout le cas se produit, alors l'amplitude de l'erreur est peut-être faible[16], 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 :
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 deux é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 varie 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 inacceptable, ou bien si on ne sait pas en évaluer l'impact, alors il est sûrement nécessaire de se poser la question de savoir pourquoi on utilise UTC et quel est le besoin de précision nécessaire, ou bien de prévoir l'usage de tables à mettre à jour dès que l'insertion/retrait d'une seconde intercalaire est programmé[10],[17].
Hormis les très rares anomalies mentionnées précédemment à propos des secondes intercalaires, il est aisé de convertir une heure UTC en une heure Posix et inversement.
Exemple : Quelle est l'heure Posix en tout début de la journée du (ligne 5 du tableau 1 ci-dessus) :
Nombre de jours écoulés | Nombre de secondes écoulées (hors secondes intercalaires) | ||||
---|---|---|---|---|---|
1 970 | 1 971 | 1 972 | 1 973 | 3 x 365 + 366 = 1 461 | 1 461 x 86 400 = 126 230 400 |
1 974 | 1 975 | 1 976 | 1 977 | 1 461 | 126 230 400 |
1 978 | 1 979 | 1 980 | 1 981 | 1 461 | 126 230 400 |
1 982 | 1 983 | 1 984 | 1 985 | 1 461 | 126 230 400 |
1 986 | 1 987 | 1 988 | 1 989 | 1 461 | 126 230 400 |
1 990 | 1 991 | 1 992 | 1 993 | 1 461 | 126 230 400 |
1 994 | 1 995 | 1 996 | 1 997 | 1 461 | 126 230 400 |
1 998 | 1 999 | 2 000[18] | 2 001 | 1 461 | 126 230 400 |
2 002 | 2 003 | 2 004 | 2 005 | 1 461 | 126 230 400 |
2 006 | 2 007 | 2 008 | 2 x 365 + 366 = 1 096 | 94 694 400 | |
Total | 14 245 | heure Posix au 1er janvier 2009 14 245 x 86 400 = 1 230 768 000 secondes |
Il existe des outils[19] qui réalisent ces calculs très simplement, comme ce « shell script » pour convertir une date en un nombre de secondes depuis l'époque Posix :
#!/bin/sh # 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" "+heure POSIX = %s secondes" # # affiche: heure POSIX = 1230768000 secondes # date --date "$*" "+%s secondes"
Le calcul inverse ne présente pas de difficulté, et de la même façon, il existe des outils[19] qui réalisent ces calculs très simplement, comme ce « shell script » pour convertir un nombre de secondes depuis l'époque Posix en une date :
#!/bin/sh # convertir un nombre de secondes depuis l'époque Posix # en date # # exemple: date -u --iso-8601=seconds --date "1970-01-01 1230768000 seconds" # # affiche: 2009-01-01T00:00:00+00:00 # date -u -R --date "1970-01-01 $* seconds"
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 couramment utilisé pour manipuler l'heure UNIX, malheureusement la norme POSIX n'en précise pas (clairement) la taille :
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 forcément en cause le fonctionnement de la machine elle-même, c'est-à-dire le fonctionnement de son système d'exploitation[20] 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 également que toutes les machines qui lui sont connectées[21] soient capables de gérer cette limite et ce de la même façon.
Plusieurs cas peuvent se présenter :
Les systèmes Unix entretiennent en général 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 à 999999 */ };
L'emploi de cette résolution inférieure à une seconde amène la question de savoir ce qui se passe lorsqu'une seconde intercalaire est ajoutée ou retranchée ? Il semblerait que ce point soit à la charge du système d'exploitation[24]. En l'absence de spécification claire, plusieurs scénarios sont donc possibles en fonction du système d'exploitation considéré[25],[26],[27]. 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 facilement être adaptés au cas de la suppression :
# | 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 |
# | 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 |
# | 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 |
L'idée d'utiliser le temps atomique international a été proposée et défendue par de nombreuses personnes[29], mais ce n'est pas le sens qui a été donné par l'histoire, le choix retenu fut celui qui aujourd'hui est figé par la norme POSIX.
Daniel J. Bernstein a écrit des articles et logiciels[23] pour l'utilisation de TAI sur des systèmes de type UNIX. Son idée était de faire en sorte que les machines Unix entretiennent en interne une heure TAI, c'est-à-dire un nombre exact de secondes écoulées depuis une certaine epoch. C'est un compteur dont le fonctionnement n'est pas perturbé par l'insertion, ou suppression, de secondes intercalaires.
L'origine de l'heure TAI est définie de la façon suivante[31]:
Depuis le développement du protocole NTP Network Time Protocol, à l'exception de quelques cas particuliers, la très grande majorité des machines Unix sont aujourd'hui toutes synchronisées sur une même heure de référence.
Il devient alors légitime de se demander si l'heure affichée par une machine Unix est bien l'heure « exacte », ou bien si l'utilisateur doit, à sa charge, ajouter la somme arithmétiques des secondes intercalaires qui ont été insérées, ou retranchées, depuis l'epoch Unix. La réponse est simple, mais le mot « exact » peut être trompeur:
Une seconde catégorie de question revient régulièrement: « est ce que l'affichage d'une heure locale modifie l'heure Unix de la machine Unix ? ». La réponse est simple:
$ (unset TZ ; echo -en 'Date et heure UTC\t: '; date --iso-8601=seconds --utc) $ (export TZ='Europe/Paris' ; echo -en "Date et heure $TZ\t: "; date --iso-8601=seconds) $ (export TZ='Canada/Eastern'; echo -en "Date et heure $TZ\t: "; date --iso-8601=seconds) Date et heure UTC : 2023-09-01T09:04:46+00:00 Date et heure Europe/Paris : 2023-09-01T11:04:46+02:00 Date et heure Canada/Eastern: 2023-09-01T05:04:46-04:00 $ (unset TZ; date --utc '+%s'); (export TZ='Canada/Eastern'; date '+%s') 1693559793 1693559793
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.