Travail avec les dates et l'heure en C++ : niveau avancé

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Travail avancé avec les dates et l'heure en C++ : de chrono aux fuseaux horaires

\n\n

Le 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.

\n\n

1. Bibliothèque chrono : duration, time_point et clocks

\n\n

La 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.

\n\n
#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\n

Points 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
\n\n

2. Heure système et conversion en dates calendaires

\n\n

Pour 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.

\n\n
#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\n

Important : std::put_time est disponible depuis C++11. Les spécificateurs de format sont analogues à strftime.

\n\n

3. Fuseaux horaires et C++20

\n\n

Avant 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

Blogs

Book Recommendations