web-dev-qa-db-fra.com

Obtenir un horodatage Unix avec C ++

Comment obtenir un horodatage uint unix en C++? J'ai un peu cherché sur Google et il semble que la plupart des méthodes recherchent des manières plus compliquées de représenter le temps. Je ne peux pas simplement l'obtenir en tant que uint?

54
2rs2ts

time() est la fonction la plus simple - secondes depuis Epoch. Page de manuel Linux ici .

La page cppreference liée ci-dessus donne ceci 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";
}
61
Tony Delroy
#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;
}
35
wilhelmtell

Le conseil le plus courant est faux, vous ne pouvez pas simplement compter sur time(). C'est utilisé pour le timing relatif: ISO C++ ne spécifie pas que 1970-01-01T00:00Z Est time_t(0)

Le pire, c'est que vous ne pouvez pas le comprendre facilement non plus. Bien sûr, vous pouvez trouver la date du calendrier de time_t(0) avec gmtime, mais qu'allez-vous faire si c'est 2000-01-01T00:00Z? Combien de secondes y at-il entre 1970-01-01T00:00Z Et 2000-01-01T00:00Z? Ce n'est certainement pas un multiple de 60, à cause des secondes intercalaires.

15
MSalters
#include <iostream>
#include <sys/time.h>

using namespace std;

int main ()
{
  unsigned long int sec= time(NULL);
  cout<<sec<<endl;
}
5
anijhaw

Windows utilise une époque et une unité de temps différentes: voir Convertir Windows Filetime en seconde sous Unix/Linux

Ce que std :: time () renvoie sous Windows m'est (encore) inconnu (;-))

4
davecb

J'ai créé une définition globale 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);

Utilisez-le 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

Mettez ces lignes dans votre fichier d'en-tête. Je trouve cela très utile pour le débogage, etc.

2
xinthose

Comme il s'agit du premier résultat sur Google et qu'il n'y a pas encore de réponse C++ 11, voici comment utiliser std :: chrono pour le 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 le 1/1/1970, mais dans la pratique, c’est très probable.

1
Tharwen