GNU/Linux >> Tutoriales Linux >  >> Linux

Conversión de marca de tiempo Unix de 64 bits

Necesitas:

typedef long long time64_t; 
time64_t mktime64(struct tm *t); 
struct tm* localtime64_r(const time64_t* t, struct tm* p);

Originalmente (en 2011) esta respuesta contenía enlaces a 2038bug.com donde era posible descargar el pequeño pivotal_gmtime_r biblioteca, que contiene las funciones mencionadas. La biblioteca se eliminó de 2038bug.com en ese entonces, los enlaces se rompieron y un moderador los eliminó de la respuesta. Parece que pivotal_gmtime_r el código ahora se puede encontrar aquí:

https://github.com/franklin373/mortage/tree/master/time_pivotal

Además, encontré otra biblioteca más reciente, llamada y2038 , que también implementa mktime64 y localtime64_r :

https://github.com/evalEmpire/y2038


La función que convierte un struct tm* a un time_t es mktime . Puede encontrar muchas implementaciones de la misma, por ejemplo. en Glibc y en mktime.c de libvxc expediente. Puede tomar el código (suponiendo que sea legal para usted, así que respete las licencias) y cambie time_t a un entero de 64 bits como int64_t .

Las funciones que realizan las otras conversiones desde time_t a struct tm* son localtime o gmtime y tú podrías hacer lo mismo.

Sin embargo, es posible que tenga un problema más fundamental:su máquina de 32 bits que se ejecuta en el año 2040 debería tener alguna forma de darle la hora actual (como el time la llamada del sistema lo hace) apropiadamente en la variante de 64 bits de time_t , y eso es mucho más difícil (depende del kernel y del hardware).


Parece que estás suponiendo que time_t es de 32 bits en sistemas de 32 bits, y esto puede o no ser cierto.

En Windows, comenzando con Visual Studio 2005 del tamaño de time_t es de 64 bits, incluso cuando compila para Windows de 32 bits.

La parte desafortunada es que glibc lo define como long int , que en los sistemas de 32 bits es un número entero de 32 bits. Eso significa que Linux de 32 bits y otras plataformas de 32 bits basadas en gcc/glibc (como Cygwin) no podrán funcionar con marcas de tiempo de 64 bits.

Si su aplicación debe ejecutarse en glibc de 32 bits, debe usar sus propias funciones de conversión, que podrían ser las mismas funciones en la biblioteca C recompiladas para usar marcas de tiempo de 64 bits.

Si necesita un código fuente con una licencia permisiva (BSD), puede ver estas funciones en minix3. Aquí está la hora local. La fuente tiene hipervínculos, por lo que puede encontrar los demás fácilmente.


Linux
  1. Vinculación de la biblioteca de 32 bits al programa de 64 bits

  2. Cómo convertir DATE a UNIX TIMESTAMP en script de shell en MacOS

  3. Espacio de direcciones del proceso de 32 bits en Linux de 64 bits

  4. ¿Cómo determinar el bitness del hardware y el sistema operativo?

  5. Ejecute la aplicación de 64 bits en el sistema Ubuntu de 32 bits

¿Tu Ubuntu es un sistema operativo de 32 bits o de 64 bits?

¿Tu Ubuntu es un sistema operativo de 32 bits o de 64 bits? [GUI + Terminal]

Linux frente a Unix

Cómo saber si la versión de Linux es de 32 bits o de 64 bits

¿Cómo verificar que el sistema Linux sea de 32 bits o de 64 bits?

verifique qué paquetes de 32 bits están instalados en un servidor de 64 bits