Come ottengo l'ora corrente su Linux in millisecondi?
Risposte:
Ciò può essere ottenuto utilizzando la funzione POSIXclock_gettime
.
Nella versione corrente di POSIX, gettimeofday
è contrassegnato come obsoleto . Ciò significa che potrebbe essere rimosso da una versione futura della specifica. Gli autori di applicazioni sono incoraggiati a utilizzare la clock_gettime
funzione invece di gettimeofday
.
Ecco un esempio di come utilizzare 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);
}
Se il tuo obiettivo è misurare il tempo trascorso e il tuo sistema supporta l'opzione "orologio monotonico", dovresti considerare di usare CLOCK_MONOTONIC
invece di CLOCK_REALTIME
.
gcc
comando.
s
quando questo accade. Probabilmente un evento raro, ma la cifra in più può causare problemi.
Di seguito è riportata la funzione util per ottenere il timestamp corrente in millisecondi:
#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;
}
Informazioni sul fuso orario :
supporto gettimeofday () per specificare il fuso orario, io uso NULL , che ignora il fuso orario, ma puoi specificare un fuso orario, se necessario.
@Update - fuso orario
Poiché la long
rappresentazione del tempo non è rilevante o influenzata dal fuso orario stesso, l'impostazione del tz
parametro gettimeofday () non è necessaria, poiché non farà alcuna differenza.
E, secondo la pagina man di gettimeofday()
, l'uso della timezone
struttura è obsoleto, quindi l' tz
argomento dovrebbe normalmente essere specificato come NULL, per i dettagli si prega di controllare la pagina man.
tz
parametro gettimeofday()
as &(struct timezone tz = {480, 0})
non avrò nessun avviso, e non ha alcun effetto sul risultato, questo ha senso, dato che la long
rappresentazione del tempo non è rilevante o effettuata dal fuso orario stesso, giusto?
NULL
è solo il valore ragionevole da passare. E credo che il test sia sempre un buon approccio per dimostrare le cose.
Utilizzare gettimeofday()
per ottenere il tempo in secondi e microsecondi. La combinazione e l'arrotondamento a millisecondi vengono lasciati come esercizio.
C11 timespec_get
Ritorna fino a nanosecondi, arrotondato alla risoluzione dell'implementazione.
È già implementato in Ubuntu 15.10. L'API ha lo stesso aspetto di 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 */
};
Maggiori dettagli qui: https://stackoverflow.com/a/36095407/895245
Derivato dalla risposta POSIX di Dan Moulding, dovrebbe funzionare:
#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);
}
Inoltre, come sottolineato da David Guyon: compilare con -lm