Como posso obter o UTCTime em milissegundos desde 1º de janeiro de 1970 no idioma C

StackOverflow https://stackoverflow.com/questions/1952290

  •  21-09-2019
  •  | 
  •  

Pergunta

Existe alguma maneira de obter milissegundos e sua parte de fração a partir de 1970 usando o tempo.h no idioma c?

Foi útil?

Solução

Isso funciona no Ubuntu Linux:

#include <sys/time.h>

...

struct timeval tv;

gettimeofday(&tv, NULL);

unsigned long long millisecondsSinceEpoch =
    (unsigned long long)(tv.tv_sec) * 1000 +
    (unsigned long long)(tv.tv_usec) / 1000;

printf("%llu\n", millisecondsSinceEpoch);

No momento da redação deste artigo, o printf () acima está me dando 1338850197035. Você pode fazer uma verificação de sanidade no TimestampConvert.com Site em que você pode inserir o valor para recuperar o tempo equivalente ao humano (embora sem precisão de milissegundo).

Outras dicas

Se você deseja uma resolução de milissegundos, pode usar gettimeofday () no POSIX. Para uma implementação do Windows, consulte GetTimeOfday Função para Windows.

#include <sys/time.h>

...

struct timeval tp;
gettimeofday(&tp);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;

Não é padrão C, mas gettimeofday() está presente nos sistemas derivados de SYSV e BSD e está em Posix. Ele retorna o tempo desde a época em um struct timeval:

struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};

Para Unix e Linux, você poderia usar gettimeofday.

Para Win32, você poderia usar GetSystemTimEasFilETime e depois converte -o em time_t + milissegundos.

    // the system time
    SYSTEMTIME systemTime;
    GetSystemTime( &systemTime );

    // the current file time
    FILETIME fileTime;
    SystemTimeToFileTime( &systemTime, &fileTime );

    // filetime in 100 nanosecond resolution
    ULONGLONG fileTimeNano100;
    fileTimeNano100 = (((ULONGLONG) fileTime.dwHighDateTime) << 32) + fileTime.dwLowDateTime;

    //to milliseconds and unix windows epoche offset removed
    ULONGLONG posixTime = fileTimeNano100/10000 - 11644473600000;
    return posixTime;

Tempo unix ou tempo posix é a hora em segundos Desde a época que você mencionou.

BzabhiA resposta está correta: você simplesmente multiplica o registro de data e hora do Unix por 1000 para obter milissegundos.

Esteja ciente de que todos os valores de milissegundos devolvidos ao contar com o timestamp Unix serão múltiplos de 1000 (como 12345678000). A resolução ainda é de apenas 1 segundo.

Você não pode obter a parte da fração

O comentário de Pavel também está correto. O timestamp do Unix não leva em consideração o salto segundos. Isso torna ainda menos sábio confiar em uma conversão para milissegundos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top