GNU/Linux >> Znalost Linux >  >> Linux

64bitová konverze časových razítek Unix

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.


Linux
  1. Jak přidat časové razítko do výstupu příkazu Unix Vmstat

  2. Existuje nějaký způsob, jak získat 64bitový time_t v 32bitových programech v Linuxu?

  3. Instalovat 64bitové Ubuntu nebo 32bitové?

  1. Hledání 32bitových knihoven v 64bitovém Linuxu

  2. Jak určit bitbit hardwaru a OS?

  3. Spusťte 64bitovou aplikaci na 32bitovém systému Ubuntu

  1. Je Mac Os X Unix?

  2. Jak přejít na nižší verzi z 64bitové na 32bitovou?

  3. Propojení 32bitové knihovny s 64bitovým programem