2009-04-19 6 views
25

Mon time.h a la définition suivante de tm:Pourquoi tm_sec est-il compris entre 0 et 60 au lieu de 0-59 dans time.h?

struct tm { 
    int tm_sec;  /* seconds after the minute [0-60] */ 
    int tm_min;  /* minutes after the hour [0-59] */ 
    int tm_hour; /* hours since midnight [0-23] */ 
    ... 
} 

Je viens de remarquer qu'ils documentent tm_sec comme allant entre 0-60 inclus. J'ai toujours supposé qu'il allait de 0-59 exactement comme tm_min. Je n'ai certainement jamais vu une horloge lire 10:37:60 ...

Pensez-vous que c'est juste un bug de la documentation de ce fichier d'origine des années 90 Berkley?

Ou y at-il quelque chose de plus subtil que je ne connais pas?

Répondre

36

Leap seconds sont la raison:

Un saut de seconde est un plus ou moins d'une seconde adaptation à l'échelle du temps universel coordonné (UTC) qui le maintient proche de l'heure solaire moyenne. Lorsqu'une seconde intercalaire positive est ajoutée à 23:59:60 UTC, elle retarde d'une seconde le début du jour UTC suivant (à 00:00:00 UTC), ralentissant ainsi l'horloge UTC.

+3

+1: me battre de 23 secondes. Et votre estimation est correcte. – dwc

+0

@dwc, l'esprit d'éditer la réponse avec quelques preuves? –

+0

http://www.opengroup.org/onlinepubs/009695399/basedefs/time.h.html et beaucoup d'autres endroits en parlent. – dwc

8

La page de manuel pour ctime explique que c'est d'environ secondes bissextiles:

tm_sec: Le nombre de secondes après la minute, normalement compris entre 0 et 59, mais peut être jusqu'à 60 pour permettre les secondes intercalaires.

Questions connexes