c time.h

¿Cómo puedo obtener UTCTime en milisegundos desde el 1 de enero de 1970 en lenguaje c?



time.h (6)

Esto funciona en Ubuntu Linux:

struct timeval tv; gettimeofday(&tv, NULL); unsigned long long millisecondsSinceEpoch = (unsigned long long)(tv.tv_sec) * 1000 + (unsigned long long)(tv.tv_usec) / 1000; printf("%llu/n", millisecondsSinceEpoch);

En el momento de escribir este artículo, el printf () anterior me da 1338850197035. Puede realizar una comprobación de cordura en el sitio web TimestampConvert.com , donde puede ingresar el valor para recuperar el tiempo equivalente legible por el ser humano (aunque sin la precisión de milisegundos) .

¿Hay alguna forma de obtener milisegundos y su parte fraccionaria a partir de 1970 usando time.h en lenguaje c?


No es C estándar, pero gettimeofday() está presente en los sistemas derivados de SysV y BSD, y está en POSIX. Devuelve el tiempo desde la época en una struct timeval :

struct timeval { time_t tv_sec; /* seconds */ suseconds_t tv_usec; /* microseconds */ };



Si desea una resolución de milisegundos, puede usar gettimeofday () en Posix. Para una implementación de Windows, vea la función gettimeofday para windows .

#include <sys/time.h> ... struct timeval tp; gettimeofday(&tp); long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;


Tiempo de Unix o tiempo de Posix es el tiempo en segundos desde la época que mencionaste.

La respuesta de bzabhi es correcta: simplemente multiplica la marca de tiempo de Unix por 1000 para obtener milisegundos.

Tenga en cuenta que todos los valores de milisegundos devueltos al confiar en la marca de tiempo de Unix serán múltiplos de 1000 (como 12345678000). La resolución es de solo 1 segundo.

No puedes obtener la parte fraccionaria

El comentario de Pavel es correcto también. La marca de tiempo de Unix no tiene en cuenta los segundos de salto . Esto hace que sea aún menos inteligente confiar en una conversión a milisegundos.


// the system time SYSTEMTIME systemTime; GetSystemTime( &systemTime ); // the current file time FILETIME fileTime; SystemTimeToFileTime( &systemTime, &fileTime ); // filetime in 100 nanosecond resolution ULONGLONG fileTimeNano100; fileTimeNano100 = (((ULONGLONG) fileTime.dwHighDateTime) << 32) + fileTime.dwLowDateTime; //to milliseconds and unix windows epoche offset removed ULONGLONG posixTime = fileTimeNano100/10000 - 11644473600000; return posixTime;