105 votes

Obtenir un timestamp Unix avec C++

Comment puis-je obtenir un uint timestamp unix en C++ ? J'ai fait quelques recherches sur Google et il semble que la plupart des méthodes cherchent des moyens plus alambiqués de représenter le temps. Ne puis-je pas simplement l'obtenir sous la forme d'un uint ?

141voto

Tony D Points 43962

C++20 a introduit une garantie que time_since_epoch est relatif à l'époque UNIX, et cppreference.com donne un exemple que j'ai distillé dans le code pertinent, et changé en unités de secondes plutôt que d'heures :

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

Utilisation de C++17 ou d'une version antérieure, time() est la fonction la plus simple - secondes depuis Epoch, qui pour Linux et UNIX au moins serait l'époque UNIX. Linux page de manuel 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";
}

5 votes

"Epoch" est bien sûr l'eproch d'Unix sur Unix et Linux, mais ce n'est pas universel.

1 votes

Notez que std::chrono::seconds est défini comme suit duration</*signed integer type of at least 35 bits*/> . Ainsi, par exemple, un int de 32 bits peut ne pas être suffisant.

54voto

wilhelmtell Points 25504
#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;
}

4 votes

Cela suppose que std::time() vous donne les secondes depuis 1970. C'est vrai sur de nombreux systèmes (POSIX et Windows, je crois), mais ce n'est pas garanti par le standard du langage.

19voto

MSalters Points 74024

Le conseil le plus courant est erroné, vous ne pouvez pas vous contenter de compter sur time() . C'est utilisé pour la synchronisation relative : L'ISO C++ ne spécifie pas que 1970-01-01T00:00Z es time_t(0)

Le pire, c'est que vous ne pouvez pas non plus le comprendre facilement. Bien sûr, vous pouvez trouver la date du calendrier de time_t(0) con gmtime mais que vas-tu faire si c'est 2000-01-01T00:00Z ? Combien de secondes se sont écoulées entre 1970-01-01T00:00Z y 2000-01-01T00:00Z ? Ce n'est certainement pas un multiple de 60, en raison des secondes intercalaires.

1 votes

"Comment obtenir un timestamp unix uint en C++ ?" - étant donné - comme vous l'avez dit - que vous pouvez appeler gmtime() plus tard pour obtenir une représentation lisible de ce que cet horodatage encode, la fonctionnalité demandée dans la question n'est pas satisfaite par time() indépendamment de la date de référence ou de la possibilité d'effectuer des calculs d'intervalles ?

3 votes

Pour obtenir un UNIX sur un système non-UNIX, vous devez connaître la différence (en secondes) entre l'époque locale et la date de l'événement. 1970-01-01T00:00Z . Il n'y a tout simplement pas de méthode qui permette de le faire.

0 votes

Pour une raison quelconque, j'ai eu l'impression que la question concernait le code sur une machine UNIX (ou Linux, etc.), mais je vois maintenant où vous voulez en venir. Curieux : avez-vous trouvé un système réel où time_t(0) n'était pas 1970-01-01T00:00Z ? Ce ne serait que quelques minutes de travail pour trouver un décalage sur un système donné (prendre le time_t(0) non-UNIX et obtenir un time_t pour lui sur un système UNIX), mais merci d'avoir expliqué votre problème.

9voto

anijhaw Points 2828
#include <iostream>
#include <sys/time.h>

using namespace std;

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

0 votes

time() renvoie un résultat de type time_t qui peut en principe être signé, non signé ou même à virgule flottante. Pourquoi stocker le résultat dans un long int ? Et pourquoi utiliser <sys/time.h> plutôt que la norme <time.h> ?

0 votes

Je comprends mais je pense que dans tout système d'exploitation compatible avec Posix, les fichiers time.h et sys/time.h sont tous deux présents. Vous avez également tout à fait raison de dire que time_t peut avoir une valeur négative car il est représenté par les secondes écoulées depuis 1970-01-01T00:00Z.

5voto

davecb Points 59

Windows utilise une époque et des unités de temps différentes : voir Convertir le temps de fichier de Windows en secondes sous Unix/Linux

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X