Existe-t-il un moyen d'obtenir des millisecondes et sa fraction à partir de 1970 en utilisant time.h en langage c?
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).
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;
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 */
};
Pour Unix et Linux, vous pouvez utiliser gettimeofday .
Pour Win32, vous pouvez utiliser GetSystemTimeAsFileTime puis le convertir en time_t + millisecondes .
// 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;
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.