In C ++ 20 wurde eine Garantie eingeführt, die time_since_epoch
sich auf die UNIX-Epoche bezieht , und cppreference.com gibt ein Beispiel, das ich auf den relevanten Code destilliert und in Einheiten von Sekunden anstatt in Stunden geändert habe:
#include <iostream>
#include <chrono>
int main()
{
const auto p1 = std::chrono::system_clock::now();
std::cout << "seconds since epoch: "
<< std::chrono::duration_cast<std::chrono::seconds>(
p1.time_since_epoch()).count() << '\n';
}
Die Verwendung von C ++ 17 oder früher time()
ist die einfachste Funktion - Sekunden seit Epoche, die für Linux und UNIX zumindest die UNIX-Epoche wäre. Linux Manpage hier .
Die oben verlinkte cppreference-Seite gibt dieses Beispiel :
#include <ctime>
#include <iostream>
int main()
{
std::time_t result = std::time(nullptr);
std::cout << std::asctime(std::localtime(&result))
<< result << " seconds since the Epoch\n";
}
#include<iostream> #include<ctime> int main() { std::time_t t = std::time(0); // t is an integer type std::cout << t << " seconds since 01-Jan-1970\n"; return 0; }
quelle
std::time()
Sie seit 1970 Sekunden haben. Dies gilt für viele Systeme (POSIX und Windows, glaube ich), wird jedoch vom Sprachstandard nicht garantiert.Der häufigste Rat ist falsch, man kann sich nicht einfach darauf verlassen
time()
. Das ist für eine relative Timing verwendet: ISO C ++ nicht spezifiziert , dass1970-01-01T00:00Z
isttime_t(0)
Schlimmer ist, dass man es auch nicht leicht herausfinden kann. Sicher, Sie können das Kalenderdatum von
time_t(0)
mit findengmtime
, aber was werden Sie tun, wenn das so ist2000-01-01T00:00Z
? Wie viele Sekunden waren zwischen1970-01-01T00:00Z
und2000-01-01T00:00Z
? Aufgrund von Schaltsekunden ist es sicherlich kein Vielfaches von 60.quelle
gmtime()
später anrufen , um eine lesbare Darstellung dessen zu erhalten, was dieser Zeitstempel codiert. Welche in der Frage angeforderte Funktionalitättime()
wird unabhängig vom Referenzdatum oder der Eignung für Intervallberechnungen nicht erfüllt ?1970-01-01T00:00Z
. Es gibt einfach keine Methode, die das macht.Da dies das erste Ergebnis bei Google ist und es noch keine C ++ 20-Antwort gibt, gehen Sie wie folgt vor, um std :: chrono zu verwenden:
#include <chrono> //... using namespace std::chrono; int64_t timestamp = duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
In Versionen von C ++ vor 20 ist die Epoche von system_clock als Unix-Epoche eine De-facto-Konvention, die jedoch nicht standardisiert ist. Wenn Sie nicht mit C ++ 20 arbeiten, erfolgt die Verwendung auf eigenes Risiko.
quelle
#include <iostream> #include <sys/time.h> using namespace std; int main () { unsigned long int sec= time(NULL); cout<<sec<<endl; }
quelle
time()
Gibt ein Ergebnis vom Typ zurücktime_t
, das im Prinzip entweder vorzeichenbehaftet, vorzeichenlos oder sogar Gleitkomma sein kann. Warum das Ergebnis in a speichernlong int
? Und warum<sys/time.h>
eher als den Standard verwenden<time.h>
?Windows verwendet eine andere Epoche und Zeiteinheiten: Siehe Konvertieren von Windows Filetime in Sekunden unter Unix / Linux
Was std :: time () unter Windows zurückgibt, ist mir (noch) unbekannt (;-))
quelle
Ich habe eine globale Definition mit weiteren Informationen erstellt:
#include <iostream> #include <ctime> #include <iomanip> #define __FILENAME__ (__builtin_strrchr(__FILE__, '/') ? __builtin_strrchr(__FILE__, '/') + 1 : __FILE__) // only show filename and not it's path (less clutter) #define INFO std::cout << std::put_time(std::localtime(&time_now), "%y-%m-%d %OH:%OM:%OS") << " [INFO] " << __FILENAME__ << "(" << __FUNCTION__ << ":" << __LINE__ << ") >> " #define ERROR std::cout << std::put_time(std::localtime(&time_now), "%y-%m-%d %OH:%OM:%OS") << " [ERROR] " << __FILENAME__ << "(" << __FUNCTION__ << ":" << __LINE__ << ") >> " static std::time_t time_now = std::time(nullptr);
Verwenden Sie es so:
INFO << "Hello world" << std::endl; ERROR << "Goodbye world" << std::endl;
Beispielausgabe:
16-06-23 21:33:19 [INFO] main.cpp(main:6) >> Hello world 16-06-23 21:33:19 [ERROR] main.cpp(main:7) >> Goodbye world
Fügen Sie diese Zeilen in Ihre Header-Datei ein. Ich finde das sehr nützlich zum Debuggen usw.
quelle
#define
und nicht eine Funktion? Funktion wäre flexibler,__FILE__``__FUNCTION__``__LINE__
nicht wie vorgesehen funktionieren würde. Dies ist ein Makro.