2009-04-19 5 views
25

Mein time.h hat die folgende Definition von tm:Warum liegt tm_sec zwischen 0 und 60 statt 0 - 59 in 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] */ 
    ... 
} 

Ich habe gerade bemerkt, dass sie tm_sec als im Bereich zwischen 0-60 inklusive dokumentieren. Ich habe immer angenommen, dass es von 0 bis 59 reichte, genau wie tm_min. Ich habe sicher nie eine Uhr 10:37:60 ...

Sie denken, Sie lesen gesehen ist dies nur eine Dokumentation Fehler aus dieser 90-Ära links über Datei-Berkley entstanden?

Oder gibt es etwas subtiler geht, dass ich nicht bewusst?

Antwort

36

Leap seconds sind der Grund dafür:

Eine Schaltsekunde ist ein Plus oder minus einer zweiten Einstellung auf die koordinierte Weltzeit (UTC) Zeitskala, die es in der Nähe mittleren Sonnenzeit hält.

Wenn eine positive Schaltsekunde um 23:59:60 UTC hinzugefügt wird, wird der Start des folgenden UTC-Tags (um 00:00:00 UTC) um eine Sekunde verzögert, wodurch der UTC-Takt effektiv verlangsamt wird.

+3

+1: schlagen Sie mich um 23 Sekunden. Und deine Vermutung ist richtig. – dwc

+0

@dwc, die Antwort mit einigen Beweisen bearbeiten? –

+0

http://www.opengroup.org/onlinepubs/009695399/basedefs/time.h.html und viele andere Orte erzählen davon. – dwc

8

Die Manpage ctime erklärt, dass dies über Schaltsekunden ist:

tm_sec: Die Anzahl der Sekunden nach der Minute, in der Regel im Bereich von 0 bis 59, kann aber bis zu 60 sein um Schaltsekunden zu ermöglichen.