Como obtenho a hora atual no Linux em milissegundos?
86
Isso pode ser feito usando a função POSIXclock_gettime
.
Na versão atual do POSIX, gettimeofday
está marcado como obsoleto . Isso significa que pode ser removido de uma versão futura da especificação. Os criadores de aplicativos são incentivados a usar a clock_gettime
função em vez de gettimeofday
.
Aqui está um exemplo de como usar 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 o seu objetivo é medir o tempo decorrido e o seu sistema suporta a opção "relógio monotônico", então você deve considerar o uso em CLOCK_MONOTONIC
vez de CLOCK_REALTIME
.
gcc
comando.s
quando isso acontecer. Provavelmente um evento raro, mas o dígito extra pode causar problemas.Você tem que fazer algo assim:
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
fonte
A seguir está a função util para obter o carimbo de data / hora atual em milissegundos:
#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; }
Sobre o fuso horário :
@Update - fuso horário
Uma vez que a
long
representação do tempo não é relevante ou efetuada pelo próprio fuso horário, definir otz
parâmetro gettimeofday () não é necessário, pois não fará nenhuma diferença.E, de acordo com a página de manual de
gettimeofday()
, o uso datimezone
estrutura é obsoleto, portanto, otz
argumento normalmente deve ser especificado como NULL, para obter detalhes, verifique a página de manual.fonte
tz
parâmetro degettimeofday()
como&(struct timezone tz = {480, 0})
não recebo nenhum aviso, e não surte efeito no resultado, faz sentido, já que along
representação do tempo não é relevante ou efetuada pelo próprio fuso horário, certo?NULL
é o valor razoável a passar. E acredito que testar é sempre uma boa abordagem para provar coisas.Use
gettimeofday()
para obter o tempo em segundos e microssegundos. Combinar e arredondar para milissegundos é deixado como um exercício.fonte
C11
timespec_get
Ele retorna até nanosegundos, arredondado para a resolução da implementação.
Já está implementado no Ubuntu 15.10. API tem a mesma aparência do 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 */ };
Mais detalhes aqui: https://stackoverflow.com/a/36095407/895245
fonte
Derivado da resposta POSIX de Dan Moulding, isso deve funcionar:
#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); }
Também como apontado por David Guyon: compilar com -lm
fonte