Obtenir le timestamp Unix, C++
Question
Comment puis-je obtenir un uint
le timestamp unix en C++?J'ai googlé un peu et il semble que la plupart des méthodes sont à la recherche pour plus alambiqué manières de représenter le temps.Je ne peux pas juste l'obtenir comme un uint
?
La solution
time()
est le plus simple de la fonction de secondes depuis l'Epoch.Linux man ici.
Le cppreference page liée ci-dessus donne ce exemple:
#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";
}
Autres conseils
#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;
}
La plus commune des conseils est mauvais, vous ne pouvez pas compter sur time()
.Qui est utilisé pour la chronologie relative:ISO C++ n'est pas préciser que 1970-01-01T00:00Z
est time_t(0)
Ce qui est pire, c'est que vous ne pouvez pas facilement le comprendre, soit.Bien sûr, vous pouvez trouver le calendrier de la date de time_t(0)
avec gmtime
, mais qu'allez-vous faire si c'est 2000-01-01T00:00Z
?Combien de secondes entre 1970-01-01T00:00Z
et 2000-01-01T00:00Z
?C'est certainement pas un multiple de 60, en raison de secondes intercalaires.
#include <iostream>
#include <sys/time.h>
using namespace std;
int main ()
{
unsigned long int sec= time(NULL);
cout<<sec<<endl;
}
Windows utilise une autre époque et les unités de temps:voir Convertir Windows Filetime à la deuxième place de Unix/Linux
Ce que std::time() retourne sur Windows est (encore) inconnu pour moi (;-))
J'ai créé un mondial de définir avec plus d'informations:
#include <iostream>
#include <ctime>
#include <iomanip>
#define INFO std::cout << std::put_time(std::localtime(&time_now), "%y-%m-%d %OH:%OM:%OS") << " [INFO] " << __FILE__ << "(" << __FUNCTION__ << ":" << __LINE__ << ") >> "
#define ERROR std::cout << std::put_time(std::localtime(&time_now), "%y-%m-%d %OH:%OM:%OS") << " [ERROR] " << __FILE__ << "(" << __FUNCTION__ << ":" << __LINE__ << ") >> "
static std::time_t time_now = std::time(nullptr);
L'utiliser comme ceci:
INFO << "Hello world" << std::endl;
ERROR << "Goodbye world" << std::endl;
Exemple de sortie:
16-06-23 21:33:19 [INFO] src/main.cpp(main:6) >> Hello world
16-06-23 21:33:19 [ERROR] src/main.cpp(main:7) >> Goodbye world
Mettre ces lignes dans votre fichier d'en-tête.Je trouve cela très utile pour le débogage, etc.
Car c'est le premier résultat sur google et il n'y a pas de C++11 encore de réponse, voici comment utiliser std::chrono pour ce faire:
#include <chrono>
...
using namespace std::chrono;
int64_t timestamp = duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
Notez que cette réponse ne garantit pas que l'époque est 1/1/1970, mais dans la pratique, il est très probable que ce soit.