Potřebujete:
typedef long long time64_t;
time64_t mktime64(struct tm *t);
struct tm* localtime64_r(const time64_t* t, struct tm* p);
Původně (v roce 2011) tato odpověď obsahovala odkazy na 2038bug.com, kde bylo možné stáhnout malý pivotal_gmtime_r
knihovna, obsahující zmíněné funkce. Knihovna byla tehdy z 2038bug.com odstraněna, odkazy byly nefunkční a byly odstraněny z odpovědi moderátorem. Zdá se, že pivotal_gmtime_r
kód nyní naleznete zde:
https://github.com/franklin373/mortage/tree/master/time_pivotal
Také jsem našel jinou, novější knihovnu s názvem y2038
, který také implementuje mktime64
a localtime64_r
:
https://github.com/evalEmpire/y2038
Funkce převádějící struct tm*
na time_t
je mktime
. Můžete najít mnoho jeho implementací, např. v Glibc a v libvxc mktime.c
soubor. Můžete vzít kód (za předpokladu, že je pro vás legální, takže respektujte licence) a změnit time_t
na nějaké 64bitové celé číslo jako int64_t
.
Funkce provádějící ostatní konverze z time_t
na struct tm*
jsou localtime
nebo gmtime
a vy můžete udělat totéž.
Můžete však mít zásadnější problém:váš 32bitový stroj běžící v roce 2040 by měl mít nějaký způsob, jak vám poskytnout aktuální čas (jako time
systémová volání ano) vhodně v 64bitové variantě time_t
, a to je mnohem těžší (záleží na jádře a hardwaru).
Zdá se, že vycházíte z předpokladu, že time_t
je 32bitový na 32bitových systémech a to může, ale nemusí být pravda.
V systému Windows počínaje sadou Visual Studio 2005 o velikosti time_t
je 64bitový, i když kompilujete pro 32bitový Windows.
Nešťastné je, že glibc to definuje jako long int
, což je na 32bitových systémech 32bitové celé číslo. To znamená, že 32bitový Linux a další 32bitové platformy založené na gcc/glibc (jako Cygwin) nebudou moci pracovat s 64bitovými časovými razítky.
Pokud vaše aplikace musí běžet na 32bitovém glibc, měli byste použít své vlastní konverzní funkce, což by mohly být stejné funkce v knihovně C překompilované pro použití 64bitových časových razítek.
Pokud potřebujete zdrojový kód s permisivní licencí (BSD), můžete se na tyto funkce podívat v minix3. Zde je místní čas. Zdroj je opatřen hypertextovým odkazem, takže ostatní snadno najdete.