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 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 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 à 999 999 */ };
L'emploi de cette résolution inférieure à une seconde amène la question de savoir ce qui se passe lorsque une seconde intercalaire est ajoutée ou retranchée ? Il semblerait que ce point soit à la charge du système d'exploitation. En l'absence de spécification claire, plusieurs scénarios sont donc possibles en fonction du système d'exploitation considéré. 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 déjà été proposée et défendue par de nombreuses personnes, 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 également écrit des articles et logiciels pour l'utilisation de TAI sur des systèmes de type UNIX.