Comment obtenir l'heure actuelle sous Linux en millisecondes?
Ceci peut être réalisé en utilisant POSIX clock_gettime
fonction.
Dans la version actuelle de POSIX, gettimeofday
est marqué comme étant obsolète . Cela signifie qu'il peut être supprimé d'une version future de la spécification. Les auteurs d’application sont encouragés à utiliser le clock_gettime
fonction au lieu de gettimeofday
.
Voici un exemple d'utilisation de clock_gettime
:
#define _POSIX_C_SOURCE 200809L
#include <inttypes.h>
#include <math.h>
#include <stdio.h>
#include <time.h>
void print_current_time_with_ms (void)
{
long ms; // Milliseconds
time_t s; // Seconds
struct timespec spec;
clock_gettime(CLOCK_REALTIME, &spec);
s = spec.tv_sec;
ms = round(spec.tv_nsec / 1.0e6); // Convert nanoseconds to milliseconds
if (ms > 999) {
s++;
ms = 0;
}
printf("Current time: %"PRIdMAX".%03ld seconds since the Epoch\n",
(intmax_t)s, ms);
}
Si votre objectif est de mesurer le temps écoulé et que votre système prend en charge l'option "Horloge monotone", vous devez envisager d'utiliser CLOCK_MONOTONIC
au lieu de CLOCK_REALTIME
.
Vous devez faire quelque chose comme ça:
struct timeval tv;
gettimeofday(&tv, NULL);
double time_in_mill =
(tv.tv_sec) * 1000 + (tv.tv_usec) / 1000 ; // convert tv_sec & tv_usec to millisecond
Voici la fonction util pour obtenir l’horodatage actuel en millisecondes:
#include <sys/time.h>
long long current_timestamp() {
struct timeval te;
gettimeofday(&te, NULL); // get current time
long long milliseconds = te.tv_sec*1000LL + te.tv_usec/1000; // calculate milliseconds
// printf("milliseconds: %lld\n", milliseconds);
return milliseconds;
}
À propos du fuseau horaire:
gettimeofday () support pour spécifier le fuseau horaire, j'utilise NULL , qui ignore le fuseau horaire, mais vous pouvez spécifier un fuseau horaire, si nécessaire .
@ Update - timezone
Étant donné que la représentation temporelle long
n'est pas pertinente pour le timezone lui-même, le paramétrage de tz
param de gettimeofday () n'est pas nécessaire, car cela ne fera aucune différence.
Et, selon man page de gettimeofday()
, l'utilisation de la structure timezone
est obsolète, donc la tz
l'argument doit normalement être défini sur NULL. Pour plus de détails, consultez la page de manuel.
Utilisez gettimeofday()
pour obtenir le temps en secondes et en microsecondes. Combiner et arrondir à des millisecondes est laissé comme un exercice.
C11 timespec_get
Il revient aux nanosecondes, arrondi à la résolution de l'implémentation.
Il est déjà implémenté dans Ubuntu 15.10. L'API a le même aspect que le POSIX clock_gettime
.
#include <time.h>
struct timespec ts;
timespec_get(&ts, TIME_UTC);
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
Plus de détails ici: https://stackoverflow.com/a/36095407/895245