Travailler avec les dates et l'heure en C++ : de A à Z
\n\nTravailler avec les dates et l'heure est l'une des tâches fondamentales en programmation. Cela est nécessaire partout : de la journalisation des événements au calcul des délais et à la création de graphiques. En C++, ce domaine n'a historiquement pas été des plus pratiques, mais avec l'arrivée de la norme C++11 et des versions suivantes (C++14, C++17, C++20), la situation a radicalement changé. Dans cet article, nous aborderons tous les aspects clés : des fonctions C classiques à la bibliothèque moderne chrono, en passant par les minuteries, le formatage et l'analyse. Ce contenu sera utile aussi bien aux débutants qu'aux développeurs expérimentés souhaitant systématiser leurs connaissances.
1. Approche classique : time_t et structure tm
\n\nAvant l'apparition de chrono, le principal outil était les fonctions de <ctime>. Cette approche reste pertinente pour la prise en charge du code ancien et pour les tâches simples.
Fonctions principales :
\n- \n
time()— retourne l'heure actuelle sous forme detime_t(nombre de secondes depuis le 1er janvier 1970). \n localtime()— convertittime_ten structuretm(heure locale). \n gmtime()— convertit en UTC. \n strftime()— formatetmen chaîne de caractères. \n mktime()— conversion inverse :tm→time_t. \n
#include <iostream>\n#include <ctime>\n\nint main() {\n // Obtenir l'heure actuelle\n std::time_t now = std::time(nullptr);\n\n // Convertir en heure locale\n std::tm* local_tm = std::localtime(&now);\n\n // Formater en chaîne de caractères\n char buffer[80];\n std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local_tm);\n\n std::cout << "Heure actuelle : " << buffer << std::endl;\n return 0;\n}\n\nInconvénients de l'approche :
\n- \n
- Fonctionne uniquement avec les secondes (millisecondes et microsecondes indisponibles). \n
- Non sécurisé dans les environnements multithreads (utilisez
localtime_rsous POSIX). \n - La structure
tmcontient des champs faciles à confondre (année décalée de 1900, mois commençant à 0). \n - Absence de prise en charge des fuseaux horaires et des intervalles de temps. \n
2. C++ moderne : la bibliothèque chrono (C++11 et versions ultérieures)
\n\nLa bibliothèque chrono est un outil puissant et type-sécurisé pour travailler avec le temps. Elle est au cœur de tous les projets C++ modernes.
Composants principaux :
\n- \n
- Horloges (clocks) :
system_clock(heure système),steady_clock(horloge monotone pour les mesures),high_resolution_clock(résolution maximale). \n - Instants temporels (time_point) : liés à des horloges spécifiques. \n
- Durées (duration) : intervalles de temps (secondes, millisecondes, nanosecondes). \n
#include <iostream>\n#include <chrono>\n#include <thread>\n\nint main() {\n using namespace std::chrono;\n\n // Instant temporel actuel\n auto now = system_clock::now();\n\n // Convertir en time_t pour l'affichage\n std::time_t now_c = system_clock::to_time_t(now);\n std::cout << "Heure actuelle : " << std::ctime(&now_c);\n\n // Mesure du temps d'exécution\n auto start = steady_clock::now();\n std::this_thread::sleep_for(milliseconds(500)); // simulation de travail\n auto end = steady_clock::now();\n\n auto duration = duration_cast<milliseconds>(end - start);\n std::cout << "Temps écoulé : " << duration.count() << " ms" << std::endl;\n\n return 0;\n}\n\nAvantages de chrono :
\n- \n
- Haute précision (nanosecondes). \n
- Sécurité de type (impossible d'ajouter accidentellement des secondes à des millisecondes). \n
- Prise en charge de l'arithmétique (addition/soustraction