2010-09-20 25 views

risposta

13

Utilizzare gettimeofday() per ottenere il tempo in secondi e in microsecondi. La combinazione e l'arrotondamento in millisecondi viene lasciato come esercizio.

0

Se stai cercando qualcosa da digitare nella tua riga di comando, allora date +%H:%M:%S.%N ti darà il tempo con i nanosecondi.

+5

Non proprio: la domanda è contrassegnata da "C" e richiede tempo epoch in millisecondi. – pilcrow

48

Devi fare qualcosa di simile:

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 
22

In seguito è la funzione util per ottenere 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; 
} 

A proposito di fuso orario:

gettimeofday() supporto a spe cify timezone, Io uso NULL, che ignora il fuso orario, ma è possibile specificare un fuso orario, se necessario.


@Update - fusorario

Poiché la long rappresentazione del tempo non è pertinente o effettuata da fusorario stessa, così modificando tz param di gettimeofday() non è necessaria, in quanto ha vinto non fanno alcuna differenza

E, secondo uomo pagina gettimeofday(), l'uso della struttura timezone è obsoleto, quindi l'argomento tz dovrebbe di norma essere specificato come NULL, per i dettagli si prega di consultare la pagina man.

+0

> gettimeofday() supporto per specificare il fuso orario, io uso NULL, che ignora il fuso orario, ma è possibile specificare un fuso orario, se necessario. Si sbaglia. Il fuso orario deve essere introdotto esclusivamente tramite chiamata a localtime(). –

+0

@ vitaly.v.ch Ho fatto un test, passando il parametro 'tz' di' gettimeofday() 'come' & (struct timezone tz = {480, 0}) 'non otterrà alcun avviso, e non lo farà Non ha alcun effetto sul risultato, questo ha senso, dal momento che la rappresentazione "lunga" del tempo non è rilevante o influenzata dal fuso orario stesso, giusto? –

+0

Non c'era motivo di fare alcun test. Il kernel di Linux non ha informazioni corrette sui fusi orari e allo stesso tempo non ha modo di fornirlo. È un motivo per cui l'argomento tz viene elaborato in modo molto specifico. la rappresentazione lunga non ha importanza. –

72

Questo può essere ottenuto utilizzando la funzione clock_gettime.

Nella versione corrente di POSIX, gettimeofday è marked obsolete. Ciò significa che può essere rimosso da una versione futura della specifica. Gli scrittori di applicazioni sono invitati a utilizzare la funzione clock_gettime anziché 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 vostro obiettivo è quello di misurare il tempo trascorso, e il vostro sistema supporta l ' "orologio monotona" l'opzione, allora si dovrebbe considerare l'utilizzo CLOCK_MONOTONIC invece di CLOCK_REALTIME .

+5

+1 per essere POSIXly corretto - ma la tua risposta ha le unità sbagliate. L'OP non vuole il tempo _con_ millisecondi, ma il tempo _in_ millisecondi. – pilcrow

+4

Buona soluzione ma non dimenticare _-lm_ nel comando 'gcc'. –

+1

in base alla manpage per round, si desidera utilizzare lround quando si assegna il risultato a un intero (o lungo) – hildred

5

C11 timespec_get

Ritorna fino a nanosecondi, arrotondato alla risoluzione di attuazione.

È già implementato in Ubuntu 15.10. API è uguale a 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

Problemi correlati