¿Cómo puedo obtener UTC Tiempo en milisegundos desde el 1 de enero de 1970 en lenguaje C

StackOverflow https://stackoverflow.com/questions/1952290

  •  21-09-2019
  •  | 
  •  

Pregunta

¿Hay alguna manera de obtener milisegundos y su parte de fracción a partir de 1970 utilizando time.h en lenguaje C?

¿Fue útil?

Solución

Esto funciona en Ubuntu Linux:

#include <sys/time.h>

...

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 estas líneas, la función printf () por encima de mí está dando 1338850197035. Se puede hacer una comprobación de validez en el TimestampConvert.com sitio web donde se puede introducir el valor para volver el tiempo legible equivalente (aunque sin precisión de milisegundos).

Otros consejos

Si desea una resolución de milisegundos, puede utilizar gettimeofday () en POSIX. Para una implementación de Windows ver gettimeofday función para ventanas .

#include <sys/time.h>

...

struct timeval tp;
gettimeofday(&tp);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;

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

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

Para Unix y Linux que podrían usar gettimeofday .

Para Win32 se puede usar GetSystemTimeAsFileTime y luego convertirlo a time_t + 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;

tiempo Unix o el tiempo de POSIX es el tiempo en segundos desde la época que usted ha mencionado.

bzabhi 's respuesta es correcta:. Simplemente multiplica la marca de tiempo Unix por 1000 para obtener milisegundos

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

No se puede obtener la parte fraccionaria

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top