web-dev-qa-db-fra.com

Comment obtenir l'heure actuelle en millisecondes à partir de C sous Linux?

Comment obtenir l'heure actuelle sous Linux en millisecondes?

82
LLL

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.

92
Dan Moulding

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
56
yadab

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.

30
Eric Wang

Utilisez gettimeofday() pour obtenir le temps en secondes et en microsecondes. Combiner et arrondir à des millisecondes est laissé comme un exercice.

12
Donal Fellows

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