web-dev-qa-db-fra.com

Comment puis-je obtenir le temps UTC en millisecondes depuis le 1er janvier 1970 en langage c

Existe-t-il un moyen d'obtenir des millisecondes et sa fraction à partir de 1970 en utilisant time.h en langage c?

21
Siddiqui

Cela fonctionne sur 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);

Au moment d'écrire ces lignes, le printf () ci-dessus me donne 1338850197035. Vous pouvez faire un contrôle de santé mentale sur le site Web TimestampConvert.com où vous pouvez entrer la valeur pour récupérer l'équivalent lisible par l'homme temps (mais sans précision en millisecondes).

36

Si vous voulez une résolution en millisecondes, vous pouvez utiliser gettimeofday () dans Posix. Pour une implémentation de Windows, voir fonction gettimeofday pour Windows .

#include <sys/time.h>

...

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

Ce n'est pas du C standard, mais gettimeofday() est présent dans les systèmes dérivés SysV et BSD, et est dans POSIX. Il renvoie le temps depuis l'époque dans un struct timeval:

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

Pour Unix et Linux, vous pouvez utiliser gettimeofday .

Pour Win32, vous pouvez utiliser GetSystemTimeAsFileTime puis le convertir en time_t + millisecondes .

4
dalle
    // 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;
2
mede griessen

temps Unix ou temps Posix est le temps en secondes depuis l'époque que vous avez mentionnée.

bzabhi la réponse est correcte: vous multipliez simplement l'horodatage Unix par 1000 pour obtenir des millisecondes.

Sachez que toutes les valeurs en millisecondes renvoyées en vous basant sur l'horodatage Unix seront multiples sur 1000 (comme 12345678000). La résolution n'est toujours que de 1 seconde.

Vous ne pouvez pas obtenir la partie fraction

Le commentaire de Pavel est également correct. L'horodatage Unix ne prend pas en compte les secondes intercalaires . Cela rend encore moins sage de s'appuyer sur une conversion en millisecondes.

1
pavium