Wie man den aktuellen Zeitstempel in Millisekunden seit 1970 genau so erhält, wie es Java bekommt


134

In Java können wir System.currentTimeMillis()den aktuellen Zeitstempel in Millisekunden seit der Epochenzeit abrufen.

die Differenz, gemessen in Millisekunden, zwischen der aktuellen Zeit und Mitternacht, dem 1. Januar 1970 UTC.

Wie bekomme ich in C ++ das Gleiche?

Derzeit verwende ich dies, um den aktuellen Zeitstempel abzurufen -

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;

Das sieht richtig aus oder nicht?

Antworten:


239

Wenn Sie Zugriff auf die C ++ 11-Bibliotheken haben, überprüfen Sie die std::chronoBibliothek. Sie können es verwenden, um die Millisekunden seit der Unix-Epoche wie folgt abzurufen:

#include <chrono>

// ...

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

91
Nett. Fügen Sie am Ende der Zeile count () hinzu, um die Anzahl der Millisekunden in einem grundlegenden Format zu erhalten.
P1r4nh4

1
@lining: Beide Epochen sind wahrscheinlich gleich, aber ihre Werte können unterschiedlich sein. steady_clockwird immer vorwärts gehen, es ist ein wahres Maß für die Zeit seit seiner Epoche, während system_clockes eine Darstellung der logischen Zeit seit der Epoche sein kann. Mit jeder Schaltsekunde könnten die beiden je nach Implementierung des Systems weiter auseinander wachsen.
Oz.

4
Soweit ich weiß, ist die Epoche für jede der Uhren implementierungsabhängig. Die Konvention soll system_clockmit der UNIX-Epoche identisch sein, aber die Spezifikation besagt nur, dass es sich um die systemweite Echtzeit-Wanduhr handeln muss. Es ist nicht erforderlich, dass die steady_clockRealität übereinstimmt, nur dass sie sich nur vorwärts bewegt.
Oz.

1
@Jason Abgesehen davon, dass gettimeofday unter Windows nicht verfügbar ist, kann die Chronobibliothek eine höhere Auflösung bieten (gtod ist auf Mikrosekunden beschränkt), Zeiteinheiten typsicher bereitstellen, damit der Compiler Einheitenumrechnungen erzwingen kann, und mit normalen arithmetischen Operatoren arbeiten ( das Hinzufügen von timevalStrukturen ist ärgerlich).
Oz.

3
Javascript-Entwickler lachen über mich, wenn ich das
sehe

42

verwenden <sys/time.h>

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

verweisen Sie dies .


gute Lösung, auch ich denke, es sollte gettimeofday sein (& tp, NULL);
Adem

4
Zuallererst ist dies C, nicht C ++. Zweitens gibt es Probleme mit gettimeofday, siehe dies zum Beispiel.
Rustyx

17

Diese Antwort ist ziemlich ähnlich wie Oz. , Mit <chrono>für C ++ - ich kann es nicht von Oz greifen hat. obwohl...

Ich habe das Original-Snippet unten auf dieser Seite aufgenommen und es leicht modifiziert, um es zu einer vollständigen Konsolen-App zu machen. Ich liebe es, dieses kleine alte Ding zu benutzen. Es ist fantastisch, wenn Sie viel Skripte erstellen und ein zuverlässiges Tool in Windows benötigen, um die Epoche in Millisekunden zu erfassen, ohne auf VB oder weniger modernen, weniger leserfreundlichen Code zurückgreifen zu müssen.

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

Ich bekomme eine negative Zahl, -560549313das ist nicht richtig, oder?
Noitidart

1
@Noitidart Können Sie mir sagen, welche Plattform und welchen C ++ - Compiler Sie verwenden? Ich benutze dieses Ding die ganze Zeit mit Automatisierungstools und habe noch nie eine negative Ausgabe o.0 gesehen. Mehr als glücklich, es zu überprüfen. Ist das auch eine direkte Kopie oder ein modifiziertes / integriertes Programm? Ich möchte nur sicherstellen, dass es nur von diesem Code stammt.
KayleeFrye_onDeck

5
Ah @kayleeFrye_onDeck es ist, weil ich verwendet habe int! int nowms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();. Ich habe das umgeschaltet int64_tund es funktioniert! Vielen Dank, dass Sie um weitere Informationen gebeten haben!
Noitidart

unsigned long longist portabler und __int64nur bei MSVC verfügbar.
SS Anne

13

Wenn Sie gettimeofday verwenden, müssen Sie auf long long umwandeln, da sonst Überläufe und damit nicht die tatsächliche Anzahl von Millisekunden seit der Epoche auftreten: long int msint = tp.tv_sec * 1000 + tp.tv_usec / 1000; Ich gebe dir eine Nummer wie 767990892, die 8 Tage nach der Epoche rund ist ;-).

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

13

Seit C ++ 11 können Sie verwenden std::chrono:

  • Aktuelle Systemzeit abrufen: std::chrono::system_clock::now()
  • Zeit seit der Epoche bekommen: .time_since_epoch()
  • Übersetzen Sie die zugrunde liegende Einheit in Millisekunden: duration_cast<milliseconds>(d)
  • std::chrono::millisecondsin Ganzzahl übersetzen ( uint64_tum einen Überlauf zu vermeiden)
#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;
}

-25

Schließen Sie <ctime>die timeFunktion ein und verwenden Sie sie .


30
Dies gibt die Sekunden seit der Epoche zurück. Keine Millisekunden.
Progo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.