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 desteady_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