cas a 32-bit platformy

Ing. Miloslav Ponkrác postovni.holub na atlas.cz
Úterý Červen 6 23:14:10 CEST 2000


>vsichni mluvi o tom ze linuxu, unixu a 32-bitovym platformam vubec dojde
>casove rozmezi roku 2038, to je dano tim ze cas je ulozen ve forme poctu
>sekund od 1.1.1970 v integeru. Pokud by platilo ze je signed, pak by
>mnel rozmezi (2^32)/2 tedy 2147483648 sekund coz vydeleno poctem sekund
>za rok (31536000) je zaokrouhleno 68 let, a 1970+68=2038, coz je ok.
>Ovsem pripada mi nelogicke, davat promenou ktera nemuze nabyvat
>zapornych hodnot jako signed. Takze pokud by byla unsigned, tak je to 2x
>delsi rozsah tedy 136 let, coz by znamenalo ze by rozsah dosel az v roce
>2106.


To je otázkou konvencí a standardu. Podle standardu je to signed long. Tedy
přesněji by to neměl být signed long, ale typ time_t, a jako s takovým by se
s ním mělo počítat. Pokud je to signed 32-bitová hodnota, tak můžete použít
data v letech 1902 až 2038. Pokud by to byla unsigned 32-bitová hodnota, pak
je to 1970 až 2106.

Většina programů by dostala šok, kdyby hodnota byla vnímána jako unsigned,
protože se s ní podle konvencí tak nepočítá. Zkrátka to berte tak, že rok
1970 je zhruba začátek éry Unixu. Záporné hodnoty oynačují dobu temna, tedy
bez Unixu, osvícené Unixové doby mají kladné hodnoty.

Uvědomte si také, že je možné řešení, kdy čas bude zobrazen jako signed
64-bitová hodnota, což vám dává možnost pracovat s léty od přibližně 290 000
000 000 před naším letopočtem do 290 000 000 000 našeho letopočtu, což už je
dostatečné na to, aby jste nikdy v životě problém nepocítil :-))). Osobně si
myslím, že se počítá v Unixech s tímto řešením.

Toto řešení je přirozené jednak na 64-bitových procesorech, kde čas bude
automaticky jako signed 64-bit integer, a jednak se do té doby trochu
přiohnou knihovny, takže time_t bude brzy (podle mého názoru) 64-bitový i na
32-bitových platformách, tedy nějak takto:

typedef long long time_t;  /* pro GCC */

nebo

typedef __int64 time_t; /* pro některé jiné překladače */

Možná se i vytvoří paralelně množina funkcí pro práci s "novým časem", třeba
jako time64, případně timel, kdo ví? A nebo se prostě všechny přepíšou na
64-bitů rovnou.

Miloslav Ponkrác








Další informace o konferenci Linux