Travail avancé avec les dates et l'heure en C++ : de chrono aux fuseaux horaires
\n\nLe travail avec les dates et l'heure est l'une des tâches clés lors du développement de systèmes à forte charge, de journalisation, d'applications financières et de planificateurs. En C++, la bibliothèque standard offre une boîte à outils puissante, allant des simples time_t au moderne <chrono>. Dans cet article, nous aborderons des techniques avancées : mesures précises, fuseaux horaires, formatage et calculs d'intervalles.
1. Bibliothèque chrono : duration, time_point et clocks
\n\nLa bibliothèque standard <chrono> (C++11 et versions ultérieures) fournit des types pour représenter les instants temporels (time_point), les durées (duration) et les horloges (clock). Cela permet d'écrire du code indépendant de la plateforme.
#include <iostream>\n#include <chrono>\n#include <thread>\n\nint main() {\n using namespace std::chrono;\n\n // Enregistrer l'heure de début\n auto start = high_resolution_clock::now();\n\n // Simulation de travail\n std::this_thread::sleep_for(milliseconds(500));\n\n auto end = high_resolution_clock::now();\n\n // Calculer la durée\n auto duration = duration_cast<milliseconds>(end - start);\n std::cout << "Écoulé : " << duration.count() << " ms\\n";\n\n // Travail avec duration dans différentes unités\n seconds sec(1);\n milliseconds ms = sec; // conversion implicite (sans perte)\n // milliseconds ms2 = duration_cast<milliseconds>(sec); // explicite\n std::cout << "1 seconde = " << ms.count() << " ms\\n";\n\n return 0;\n}\n\nPoints clés :
\n- \n
duration_cast— conversion entre unités (peut perdre en précision). \n high_resolution_clock— horloge la plus précise (généralement une enveloppe autour du minuteur système). \n system_clock— heure système, liée au calendrier. \n steady_clock— horloge monotone, idéale pour les mesures d'intervalles. \n
2. Heure système et conversion en dates calendaires
\n\nPour travailler avec les dates calendaires (année, mois, jour), utilisez system_clock et les fonctions to_time_t / from_time_t. À partir de C++20, des outils plus pratiques sont apparus, mais nous aborderons l'approche classique.
#include <iostream>\n#include <chrono>\n#include <ctime>\n\nint main() {\n using namespace std::chrono;\n\n // Heure système actuelle\n auto now = system_clock::now();\n std::time_t now_c = system_clock::to_time_t(now);\n\n // Convertir en heure locale\n std::tm* local = std::localtime(&now_c);\n std::cout << "Heure locale : " \n << std::put_time(local, "%Y-%m-%d %H:%M:%S") << "\\n";\n\n // Créer un time_point à partir d'une date calendaire (C++20 simplifiera)\n std::tm date = {};\n date.tm_year = 2025 - 1900; // années depuis 1900\n date.tm_mon = 3; // avril (0-11)\n date.tm_mday = 15;\n date.tm_hour = 12;\n date.tm_min = 30;\n date.tm_sec = 0;\n std::time_t date_c = std::mktime(&date);\n auto date_point = system_clock::from_time_t(date_c);\n\n // Différence en jours\n auto diff = duration_cast<hours>(now - date_point).count() / 24;\n std::cout << "Jours depuis le 15.04.2025 : " << diff << "\\n";\n\n return 0;\n}\n\nImportant : std::put_time est disponible depuis C++11. Les spécificateurs de format sont analogues à strftime.
3. Fuseaux horaires et C++20
\n\nAvant C++20, le travail avec les fuseaux horaires était non trivial. En C++20, la bibliothèque <chrono> a été enrichie avec le support de time_zone et zoned_time. Si votre compilateur prend en charge C++20 (GCC 12+, Clang 15+, MSVC 2022 17.4+), vous pouvez utiliser