2010-09-20 29 views

Respuesta

13

Utilice gettimeofday() para obtener el tiempo en segundos y microsegundos. La combinación y el redondeo a milisegundos se deja como un ejercicio.

0

Si está buscando algo para escribir en su línea de comandos, date +%H:%M:%S.%N le dará el tiempo con nanosegundos.

+5

No exactamente: la pregunta está etiquetada como 'C' y pregunta por el tiempo de época en milisegundos. – pilcrow

48

que tiene que hacer algo como esto:

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

A continuación se presenta la función util para obtener fecha y hora actual en milisegundos:

#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; 
} 

Acerca de zona horaria:

gettimeofday() asistencia para spe cify timezone, Uso NULL, que ignoran la zona horaria, pero puede especificar una zona horaria, si es necesario.


@Update - zona horaria

Desde el long representación del tiempo no es relevante para o zona horaria efectuada por sí mismo, por lo que establecer tz parámetro de gettimeofday() no es necesario, ya que ganó No importa.

Y, según hombre página de gettimeofday(), el uso de la estructura timezone es obsoleta, por lo tanto el argumento tz normalmente se debe especificar como NULL, para obtener más información por favor consulte la página de manual.

+0

> gettimeofday() admite especificar zona horaria, uso NULL, que ignora la zona horaria, pero puede especificar una zona horaria, si es necesario. Usted está equivocado. La zona horaria debe introducirse exclusivamente mediante call a localtime(). –

+0

@ vitaly.v.ch Hice una prueba, pasando el 'tz' param de' gettimeofday() 'como' & (struct timezone tz = {480, 0}) 'no recibirá ninguna advertencia, y no lo hará Tiene algún efecto sobre el resultado, eso tiene sentido, ya que la representación "larga" del tiempo no es relevante ni se ve afectada por la zona horaria misma, ¿verdad? –

+0

No había ninguna razón para hacer ninguna prueba. El kernel de Linux no tiene la información adecuada sobre las zonas horarias, y al mismo tiempo no tiene una forma de proporcionarlo. Es una razón por la cual el argumento tz se procesa de manera muy específica. la larga representación no importa. –

72

Esto se puede lograr utilizando la función clock_gettime.

En la versión actual de POSIX, gettimeofday es marked obsolete. Esto significa que puede eliminarse de una versión futura de la especificación. Se recomienda a los escritores de aplicaciones que utilicen la función clock_gettime en lugar de gettimeofday.

Aquí es un ejemplo de cómo utilizar 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 su objetivo es medir el tiempo transcurrido, y el sistema es compatible con el "reloj monótona" opción, entonces usted debería considerar el uso CLOCK_MONOTONIC en lugar de CLOCK_REALTIME .

+5

+1 por ser POSIXly correcto, pero su respuesta tiene las unidades incorrectas. El OP no quiere el tiempo _with_ milisegundos, pero el tiempo _en_ ​​milisegundos. – pilcrow

+4

Buena solución, pero no olvides el _-lm_ en tu comando 'gcc'. –

+1

de acuerdo con la página de manual de round, quiere usar lround al asignar el resultado a un entero (o largo) – hildred

5

C11 timespec_get

Devuelve hasta nanosegundos, redondeado a la resolución de la aplicación.

Ya está implementado en Ubuntu 15.10. API tiene el mismo aspecto que el 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 */ 
}; 

Más detalles aquí: https://stackoverflow.com/a/36095407/895245

Cuestiones relacionadas