Travail avancé avec les dates et l'heure en C++ : chrono, time_t et analyse syntaxique

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

Introduction : Pourquoi le travail standard avec le temps en C++ est devenu plus complexe (et meilleur)

Pendant longtemps, le travail avec les dates et l'heure en C++ se résumait à l'utilisation de fonctions de <ctime> : time(), localtime(), strftime(). Cela suffisait pour des tâches simples, mais avec la complexité croissante des projets (systèmes distribués, serveurs à forte charge, applications financières), des outils plus précis, plus sûrs et plus pratiques sont devenus nécessaires.

La norme C++11 nous a offert la bibliothèque <chrono>, qui résout les problèmes de débordement, de confusion entre les unités de mesure et de dépendance à la plateforme. C++20 a fait un pas important en avant en ajoutant la prise en charge des fuseaux horaires, des types calendaires et du formatage via std::format. Dans cet article, nous examinerons des techniques avancées qui vont au-delà de la simple obtention de l'heure actuelle.



1. La bibliothèque chrono : des millisecondes aux nanosecondes et aux calendriers

Le cœur de std::chrono repose sur trois composants : l'horloge (clock), la durée (duration) et l'instant (time_point). À un niveau avancé, il est important de savoir choisir la bonne horloge et de travailler avec l'arithmétique du temps.



1.1. Choix de l'horloge : system_clock, steady_clock, high_resolution_clock

  • system_clock — représente l'heure système (calendaire). Peut être ajusté par l'utilisateur ou un service de synchronisation (NTP). Utilisé pour afficher la date à l'utilisateur.
  • steady_clock — horloge monotone. N'est jamais ajustée en arrière (no rollback). Idéale pour mesurer des intervalles (minuteries, profilage).
  • high_resolution_clock — horloge avec le plus petit tick possible. Sur la plupart des plateformes, c'est un synonyme de steady_clock.

Conseil avancé : N'utilisez jamais high_resolution_clock pour le profilage si vous avez besoin de stabilité. Utilisez steady_clock.



1.2. Travail avec duration et time_point

Un travail avancé implique non seulement la mesure du temps, mais aussi la conversion entre unités, l'arithmétique et les types personnalisés.

#include <iostream>#include <chrono>#include <thread>

int main() { using namespace std::chrono_literals; // pour les suffixes ms, s, us

// Création avancée de duration auto work_time = 2h + 30min + 15s; // 2 heures 30 minutes 15 secondes std::cout << "Temps de travail en secondes : " << work_time.count() << " s";

// Conversion avec arrondi (duration_cast) auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(work_time); std::cout << "En millisecondes : " << ms.count() << " ms";

// Mesure du temps d'exécution d'une fonction auto start = std::chrono::steady_clock::now(); std::this_thread::sleep_for(100ms); // simulation de travail auto end = std::chrono::steady_clock::now(); auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start); std::cout << "La fonction a duré : " << elapsed.count() << " µs";

return 0;}


1.3. Types calendaires (C++20)

C++20 a ajouté year_month_day, year_month, weekday et d'autres. Cela permet de manipuler les dates en toute sécurité sans travailler avec des nombres bruts.

#include <iostream>#include <chrono>

int main() { using namespace std::chrono;

// Création d'une date auto date = 2023y / October / 15d; // 15 octobre 2023 std::cout << "Date : " << date << '';

// Ajout de jours auto next_week = date + days(7); std::cout << "Dans une semaine : " << next_week << '';

// Obtention du jour de la semaine weekday wd{date}; std::cout <&l

Blogs

Book Recommendations