Comment obtenir l'heure actuelle sous Linux en millisecondes?
Réponses:
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.
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 () pour spécifier le fuseau horaire, j'utilise NULL , qui ignore le fuseau horaire, mais vous pouvez spécifier un fuseau horaire, si besoin.
@Update - fuseau horaire
Puisque la long
représentation du temps n'est pas pertinente ou affectée par le fuseau horaire lui-même, il tz
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 la timezone
structure est obsolète, donc l' tz
argument doit normalement être NULL, pour plus de détails veuillez consulter la page man.
tz
paramètre gettimeofday()
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 la long
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.
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
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