Como obter o registro de data e hora atual em milissegundos desde 1970, exatamente como o Java obtém


134

Em Java, podemos usar System.currentTimeMillis()para obter o registro de data e hora atual em milissegundos desde a época da época, que é:

a diferença, medida em milissegundos, entre o horário atual e a meia-noite, 1 de janeiro de 1970, UTC.

Em C ++, como obter a mesma coisa?

Atualmente, estou usando isso para obter o carimbo de data / hora atual -

struct timeval tp;
gettimeofday(&tp, NULL);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000; //get current timestamp in milliseconds

cout << ms << endl;

Parece certo ou não?

Respostas:


239

Se você tiver acesso às bibliotecas C ++ 11, confira a std::chronobiblioteca. Você pode usá-lo para obter os milissegundos desde a Época Unix, assim:

#include <chrono>

// ...

using namespace std::chrono;
milliseconds ms = duration_cast< milliseconds >(
    system_clock::now().time_since_epoch()
);

92
Agradável. Adicione count () no final da linha para obter o número de milissegundos em um formato de tipo fundamental.
P1r4nh4

1
@line: Ambas as épocas provavelmente são as mesmas, mas seus valores podem ser diferentes. steady_clocksempre progredirá, é uma verdadeira medida do tempo desde sua época, enquanto system_clockpode ser uma representação do tempo lógico desde a época. A cada salto de segundo, os dois poderiam se separar, dependendo da implementação do sistema.
Oz.

4
Tanto quanto eu sei, a época de cada um dos relógios depende da implementação. A convenção é system_clocka mesma da época do UNIX, mas a especificação diz apenas que deve ser o relógio de parede em tempo real do sistema. Não há exigência para que a steady_clockrealidade corresponda, apenas que ela avance.
Oz.

1
@Jason Além de o gettimeofday não estar disponível no Windows, a biblioteca chrono pode oferecer uma resolução mais alta (gtod é limitado a microssegundos), fornece unidades de tempo de maneira segura para que o compilador possa impor conversões de unidades e trabalha com operadores aritméticos normais ( adicionar timevalestruturas é irritante).
Oz.

3
Os desenvolvedores de Javascript estão rindo de mim vendo isso :(
fantastory

42

usar <sys/time.h>

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

consulte isso .


boa solução, também acho que deveria ser gettimeofday (& tp, NULL);
Adem

4
Primeiro de tudo, isso é C, não C ++. Em segundo lugar, há problemas com gettimeofday, veja isso por exemplo.
Rustyx

17

Essa resposta é bem parecida com a de Oz , usando <chrono>C ++ - eu não a peguei de Oz. Apesar...

Peguei o snippet original na parte inferior desta página e o modifiquei levemente para ser um aplicativo de console completo. Eu amo usar essa pequena coisa. É fantástico se você cria muitos scripts e precisa de uma ferramenta confiável no Windows para obter a época em milissegundos reais sem recorrer ao VB, ou a um código menos moderno e menos fácil de ler.

#include <chrono>
#include <iostream>

int main() {
    unsigned __int64 now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
    std::cout << now << std::endl;
    return 0;
}

Eu recebo um número negativo, -560549313isso não está certo, certo?
Noitidart 27/01

1
@Noitidart Você pode me dizer qual plataforma e compilador C ++ você está usando? Eu uso essa coisa o tempo todo com ferramentas de automação e nunca vi uma saída negativa o.0 Mais do que feliz em verificá-la. Além disso, é uma cópia direta ou um programa modificado / integrado? Só quero ter certeza de que ele é originário apenas deste código.
precisa saber é o seguinte

5
Ah @kayleeFrye_onDeck é porque eu estava usando int! int nowms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();. Eu swithced isso para int64_te funciona! Muito obrigado por pedir mais informações para ajudar!
Noitidart

unsigned long longé mais portátil e __int64está disponível apenas no MSVC.
SS Anne

não há nenhum __int64tipo no C ++ padrão. Pode-se usar em seu std::int64_tlugar.
jaskmar

14

Desde o C ++ 11, você pode usar std::chrono:

  • obter a hora atual do sistema: std::chrono::system_clock::now()
  • obter tempo desde a época: .time_since_epoch()
  • traduza a unidade subjacente em milissegundos: duration_cast<milliseconds>(d)
  • converter std::chrono::millisecondspara inteiro ( uint64_tpara evitar transbordamento)
#include <chrono>
#include <cstdint>
#include <iostream>

uint64_t timeSinceEpochMillisec() {
  using namespace std::chrono;
  return duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
}

int main() {
  std::cout << timeSinceEpochMillisec() << std::endl;
  return 0;
}

Eu sugiro usar em unsigned long longvez de uint64_t.
csg

13

Se usar gettimeofday, você precisará converter para long long, caso contrário, obterá overflows e, portanto, não o número real de milissegundos desde a época: long int msint = tp.tv_sec * 1000 + tp.tv_usec / 1000; fornecerá um número como 767990892, que é redondo 8 dias após a época ;-).

int main(int argc, char* argv[])
{
    struct timeval tp;
    gettimeofday(&tp, NULL);
    long long mslong = (long long) tp.tv_sec * 1000L + tp.tv_usec / 1000; //get current timestamp in milliseconds
    std::cout << mslong << std::endl;
}

-25

Inclua <ctime>e use a timefunção


30
Isso retorna os segundos desde a época. Não em milissegundos.
Progo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.