Warum wird eine vorzeichenbehaftete Ganzzahl zur Darstellung von Zeitstempeln verwendet? Es gibt einen klar definierten Start bei 1970, der als 0 dargestellt wird. Warum sollten wir also vorher Zahlen brauchen? Werden negative Zeitstempel irgendwo verwendet?
timestamps
Bakudan
quelle
quelle
Antworten:
Frühe Versionen von C hatten keine vorzeichenlosen ganzen Zahlen. (Einige Programmierer verwendeten Zeiger, wenn sie vorzeichenlose Arithmetik benötigten.) Ich weiß nicht, welche als erstes kamen, welche
time()
Funktion oder welche vorzeichenlosen Typen, aber ich vermute, dass die Darstellung hergestellt wurde, bevor vorzeichenlose Typen allgemein verfügbar waren. Und 2038 war in der Zukunft weit genug, dass es sich wahrscheinlich nicht lohnte, sich Sorgen zu machen. Ich bezweifle, dass viele Leute dachten, Unix würde bis dahin noch existieren.Ein weiterer Vorteil von signed
time_t
ist, dass Sie durch eine Erweiterung auf 64 Bit (was auf einigen Systemen bereits vorkommt) Zeiten von mehreren hundert Milliarden Jahren in die Zukunft abbilden können, ohne die Fähigkeit zu verlieren, Zeiten vor 1970 abzubilden 32-Bit ohne Vorzeichentime_t
, wir haben genug Zeit, um auf 64-Bit umzusteigen.)quelle
time
Funktion ist älter als die Epoche: Unix v1 (1971) wird ab Mitternacht am 1.1.1971 in Einheiten von 1/60 Sekunde gezählt. Es war bereits ein bekannter Fehler , dass „Der chronologische - gesinnten Anwender wird feststellen , dass 2 ** 32/60 von nur etwa 2,5 Einer zweiten Jahren.“unsigned
Wurde von eingeführt K & R 1978 , auch nach der 1970 Epoche gegründet wurde.gmtime
undlocaltime
maximal im Jahr 2147483647 (mit der nächsten Sekunde nach -2147483648 als Jahr). Um mehr als 55 Bit Zeit zu haben, muss die Ausgaberoutine aktualisiert werden, sodass ein 64-Bit-Int für das Jahr anstelle eines vorzeichenlosen 32-Bit-Int verwendet wird. Hoffentlich wird sich irgendwann in den nächsten paar Milliarden Jahren jemand um diesen Fehler kümmern.struct tm
Typ ein Mitgliedtm_year
(das Jahre seit 1900 darstellt) hat, das vom Typ istint
. 64-Bit-Systeme können problemlos über 64-Bit-time_t
Versionen verfügen, in der Regel jedoch über 32-Bit-Versionenint
. (Wennchar
8 Bit undint
64 Bit vorhanden sind,short
kann dies entweder 16 oder 32 Bit sein, und für die andere Größe gibt es keinen vordefinierten Typ.) Diestime()
ist jedoch wahrscheinlich die einzige Funktion, für<time.h>
die eine Unterstützung auf Systemebene erforderlich ist. Sie können Ihren eigenen Code schreiben, umtime_t
Werte in lesbare Zeichenfolgen umzuwandeln .Es soll Zeitstempel und Daten vor dem 1. Januar 1970 unterstützen.
quelle
time_t
nur aus 32 Bit bestehen. Auf vielen Systemen sind es bereits 64 Bit.mktime()
Die Funktion gibt-1
im Fehlerfall zurück, so dass es wahrscheinlich unmöglich ist, zwischen korrekten Zeitstempeln vor dem 01.01.1970 und Fehlern zu unterscheiden. Bewerbungstermine vor dem 01.01.1970 sind verboten1969-12-31 23:59:59 UTC
. Ein anderer negativer Wert als-1
ist eindeutig.mktime()
Aufruf zum Festlegenerrno
. (POSIX tut.)