Comment obtenir l'heure actuelle sous Linux en millisecondes?
86
Ceci peut être réalisé en utilisant la fonction POSIXclock_gettime
.
Dans la version actuelle de POSIX, gettimeofday
est marqué comme obsolète . Cela signifie qu'il peut être supprimé d'une future version de la spécification. Les développeurs d'applications sont encouragés à utiliser la clock_gettime
fonction à la place de gettimeofday
.
Voici un exemple d'utilisation 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 devriez envisager d'utiliser CLOCK_MONOTONIC
au lieu de CLOCK_REALTIME
.
gcc
commande.s
lorsque cela se produit. Probablement un événement rare, mais le chiffre supplémentaire peut causer des problèmes.Vous devez faire quelque chose comme ceci:
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
la source
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 :
@Update - fuseau horaire
Puisque la
long
représentation du temps n'est pas pertinente ou affectée par le fuseau horaire lui-même, iltz
n'est pas nécessaire de définir le paramètre de gettimeofday (), car cela ne fera aucune différence.Et, selon l' homme page
gettimeofday()
, l'utilisation de latimezone
structure est obsolète, donc l'tz
argument doit normalement être NULL, pour plus de détails veuillez consulter la page man.la source
tz
paramètregettimeofday()
as&(struct timezone tz = {480, 0})
n'obtiendra aucun avertissement, et cela n'a aucun effet sur le résultat, cela a du sens, car lalong
représentation du temps n'est pas pertinente ni affectée par fuseau horaire lui-même, non?NULL
la valeur raisonnable à passer. Et je pense que les tests sont toujours une bonne approche pour prouver les choses.Utilisez
gettimeofday()
pour obtenir l'heure en secondes et microsecondes. Combiner et arrondir en millisecondes reste un exercice.la source
C11
timespec_get
Il renvoie jusqu'à nanosecondes, arrondi à la résolution de l'implémentation.
Il est déjà implémenté dans Ubuntu 15.10. L'API ressemble au 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
la source
Dérivé de la réponse POSIX de Dan Moulding, cela devrait fonctionner:
#include <time.h> #include <math.h> long millis(){ struct timespec _t; clock_gettime(CLOCK_REALTIME, &_t); return _t.tv_sec*1000 + lround(_t.tv_nsec/1.0e6); }
Aussi comme le souligne David Guyon: compile avec -lm
la source