Dlaczego podpisana liczba całkowita jest używana do reprezentowania znaczników czasu? Jest jasno określony początek w 1970 roku, który jest reprezentowany jako 0, więc po co mielibyśmy wcześniej liczby? Czy gdziekolwiek są stosowane ujemne znaczniki czasu?
timestamps
Bakudan
źródło
źródło
Odpowiedzi:
Wczesne wersje C nie miały liczb całkowitych bez znaku. (Niektórzy programiści używali wskaźników, gdy potrzebowali arytmetyki bez znaku). Nie wiem, która była pierwsza,
time()
funkcja lub typy bez znaku, ale podejrzewam, że reprezentacja została ustanowiona, zanim typy bez znaku były powszechnie dostępne. A rok 2038 był na tyle daleko w przyszłości, że prawdopodobnie nie warto było się o to martwić. Wątpię, aby wiele osób uważało, że do tego czasu Unix będzie istniał.Kolejną zaletą podpisu
time_t
jest to, że rozszerzenie go do 64 bitów (co już dzieje się w niektórych systemach) pozwala reprezentować czasy kilkaset miliardów lat w przyszłość bez utraty zdolności do reprezentowania czasów sprzed 1970 roku. (Dlatego sprzeciwiam się przejściu na 32-bit bez znakutime_t
; mamy wystarczająco dużo czasu na przejście do 64 bitów.)źródło
time
Funkcja jest starszy niż epoki: Unix v1 (1971) liczone w jednostkach 1 / 60. sekundy, od północy na 1971/01/01. Znany już błąd polegał na tym, że „chronologicznie myślący użytkownik zauważy, że 2 ** 32 sześćdziesiątych sekundy to tylko około 2,5 roku”.unsigned
Został wprowadzony przez K&R w 1978 roku , długo po ustanowieniu epoki z 1970 roku.gmtime
ilocaltime
maks. w roku 2147483647 (z następną sekundą po podaniu -2147483648 jako roku). Aby minąć 55 bitów czasu, ktoś będzie musiał zaktualizować procedurę wyjściową, aby użyć 64-bitowej liczby int dla roku zamiast 32-bitowej liczby bez znaku. Mam nadzieję, że ktoś rozwiąże ten problem w ciągu najbliższych kilku miliardów lat.struct tm
typ ma element członkowskitm_year
(reprezentujący lata od 1900 r.), Który jest typuint
. Systemy 64-bitowe mogą łatwo mieć wersję 64-bitowątime_t
, ale zazwyczaj mają wersję 32-bitowąint
. (Jeślichar
ma 8 bitów iint
64 bitów,short
może mieć 16 lub 32 bity i nie będzie predefiniowanego typu dla drugiego rozmiaru.) Aletime()
prawdopodobnie jest to jedyna funkcja,<time.h>
która naprawdę wymaga wsparcia na poziomie systemu; możesz napisać własny kod do konwersjitime_t
wartości na ciągi czytelne dla człowieka.Ma obsługiwać znaczniki czasu i daty sprzed 1 stycznia 1970 r.
źródło
time_t
tylko 32 bitów; to już 64 bity na wielu systemach.mktime()
funkcja zwraca-1
w przypadku błędu, więc prawdopodobnie nie jest możliwe rozróżnienie między poprawnymi znacznikami czasu sprzed 1970-01-01 a błędem ts. Daty niezgodności przed 01.01.1701 są zabronione1969-12-31 23:59:59 UTC
. Wartość ujemna inna niż-1
jest jednoznaczna.mktime()
wywołania do ustawieniaerrno
. (POSIX robi.)