Come ottenere il timestamp corrente in millisecondi dal 1970 proprio come Java ottiene


135

In Java, possiamo usare System.currentTimeMillis()per ottenere il timestamp corrente in millisecondi dall'epoca che è -

la differenza, misurata in millisecondi, tra l'ora corrente e la mezzanotte, 1 gennaio 1970 UTC.

In C ++ come ottenere la stessa cosa?

Attualmente sto usando questo per ottenere il timestamp corrente -

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;

Sembra giusto o no?

Risposte:


239

Se hai accesso alle librerie C ++ 11, controlla la std::chronolibreria. Puoi usarlo per ottenere i millisecondi dall'epoca Unix in questo modo:

#include <chrono>

// ...

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

92
Bello. Aggiungi count () alla fine della riga per ottenere il numero di millisecondi in un formato di tipo fondamentale.
P1r4nh4,

1
@lining: entrambe le epoche sono probabilmente le stesse, ma i loro valori potrebbero essere diversi. steady_clockavanzerà sempre in avanti, è una vera misura del tempo dalla sua epoca mentre system_clockpuò essere una rappresentazione del tempo logico dalla epoca. Per ogni secondo bisestile i due potrebbero espandersi ulteriormente a seconda dell'implementazione del sistema.
Oz.

4
Per quanto ne so, l'epoca di ciascuno degli orologi dipende dall'implementazione. La convenzione è system_clockche deve essere uguale all'epoca UNIX, ma la specifica dice solo che deve essere l'orologio da parete in tempo reale dell'intero sistema. Non è necessario che la steady_clockrealtà corrisponda alla realtà, ma solo che va avanti.
Oz.

1
@Jason Oltre a non essere disponibile su Windows, la libreria chrono può darti una risoluzione più elevata (gtod è limitata ai microsecondi), fornisce unità di tempo in modo sicuro, in modo che il compilatore possa applicare conversioni di unità e funziona con normali operatori aritmetici ( l'aggiunta di timevalstrutture è fastidiosa).
Oz.

3
Gli sviluppatori Javascript stanno ridendo di me vedendo questo :(
fantastico

42

uso <sys/time.h>

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

riferimento questo .


buona soluzione, penso anche che dovrebbe essere gettimeofday (& tp, NULL);
Adem

4
Prima di tutto, questo è C, non C ++. In secondo luogo, ci sono problemi con gettimeofday, vedi questo per esempio.
Rustyx,

18

Questa risposta è abbastanza simile a quella di Oz. , usando <chrono>per C ++ - Non l'ho presa da Oz. anche se...

Ho raccolto lo snippet originale nella parte inferiore di questa pagina e l'ho leggermente modificato per renderlo un'app console completa. Adoro usare questa piccola cosa. È fantastico se fai molti script e hai bisogno di uno strumento affidabile in Windows per ottenere l'epoca in millisecondi reali senza ricorrere all'utilizzo di VB, o di un codice meno moderno e meno intuitivo.

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

Ho un numero negativo, -560549313non è giusto, vero?
Noitidart,

1
@Noitidart Puoi dirmi quale piattaforma e compilatore C ++ stai usando? Uso questa cosa continuamente con strumenti di automazione e non ho mai visto un risultato negativo o.0 Più che felice di verificarlo. Inoltre, è una copia diretta o un programma modificato / integrato? Voglio solo assicurarmi che provenga solo da questo codice.
kayleeFrye_onDeck

5
Ah @kayleeFrye_onDeck è perché stavo usando int! int nowms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();. L'ho scambiato int64_te funziona! Grazie mille per aver chiesto maggiori informazioni per aiutarti!
Noitidart,

unsigned long longè più portatile ed __int64è disponibile solo su MSVC.
SS Anne,

non esiste alcun __int64tipo in C ++ standard. Si può usare std::int64_tinvece.
Jaskmar,

15

Da C ++ 11 puoi usare std::chrono:

  • ottenere l'ora di sistema corrente: std::chrono::system_clock::now()
  • prendi il tempo dall'epoca: .time_since_epoch()
  • traduci l'unità sottostante in millisecondi: duration_cast<milliseconds>(d)
  • traduci std::chrono::millisecondsin intero ( uint64_tper evitare overflow)
#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;
}

Suggerisco di usare unsigned long longinvece di uint64_t.
csg

Perché unsigned long longinvece di uint64_t? Ho una preferenza naturale per il tipo più corto da digitare
Jawad

13

Se usi gettimeofday devi lanciare a lungo, altrimenti otterrai overflow e quindi non il numero reale di millisecondi dall'epoca: long int msint = tp.tv_sec * 1000 + tp.tv_usec / 1000; ti darà un numero come 767990892 che è rotondo 8 giorni dopo l'epoca ;-).

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

Includi <ctime>e usa la timefunzione.


31
Questo restituisce i secondi dall'epoca. Non millisecondi.
Progo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.