Gestion des dates et du temps en C++ : du classique à la norme moderne
La gestion des dates et du temps est l'une des tâches clés dans le développement de logiciels. Qu'il s'agisse de journalisation d'événements, de calcul d'échéances, de travail avec des minuteurs ou d'analyse de données — on ne peut pas se passer d'outils fiables. En C++, il existe plusieurs approches pour cela : de la bibliothèque classique <ctime> à la bibliothèque moderne <chrono>, apparue en C++11 et considérablement étendue en C++20. Dans cet article, nous allons examiner les principales méthodes de travail avec les dates et le temps, fournir des exemples pratiques et montrer comment éviter les erreurs typiques.
1. Approche classique : la bibliothèque <ctime>
La bibliothèque <ctime> est venue en C++ du langage C. Elle fournit des outils simples mais limités pour travailler avec le temps calendaire. Les types principaux sont : std::time_t (nombre entier de secondes depuis le 1er janvier 1970) et std::tm (structure avec les champs année, mois, jour, heures, minutes, secondes, etc.).
Exemple 1 : Obtenir l'heure actuelle et la formater
#include <iostream>#include <ctime>
int main() { // Obtenir l'heure actuelle std::time_t now = std::time(nullptr); // Convertir en heure locale std::tm* local = std::localtime(&now); // Afficher au format "AAAA-MM-JJ HH:MM:SS" char buffer[80]; std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local); std::cout << "Heure actuelle : " << buffer << std::endl; return 0;}Fonctions principales de <ctime> :
std::time()— retourne l'heure calendaire actuelle.std::localtime()— convertittime_ten une structuretmreprésentant l'heure locale.std::gmtime()— la même chose, mais pour UTC (temps universel coordonné).std::mktime()— conversion inverse : detmverstime_t.std::difftime()— calcule la différence en secondes entre deux instants.std::strftime()— formate la date et l'heure en une chaîne selon un modèle donné.
Inconvénients : la bibliothèque ne prend pas en compte les fuseaux horaires (sauf local et UTC), ne supporte pas une haute précision (secondes uniquement), et la structure tm n'est pas type-safe (par exemple, l'année est comptée à partir de 1900, le mois de 0 à 11).
2. Norme moderne : la bibliothèque <chrono> (C++11 et versions ultérieures)
À partir de C++11, la bibliothèque standard a été enrichie avec <chrono> — une bibliothèque type-safe et de haute précision pour travailler avec le temps. Elle fonctionne avec trois concepts principaux : la durée (duration), l'instant (time_point) et l'horloge (clock).
Types d'horloges :
std::chrono::system_clock— temps système, lié au calendrier (peut être converti entime_t).std::chrono::steady_clock— horloge monotone, idéale pour mesurer des intervalles (non sujette aux ajustements).std::chrono::high_resolution_clock— horloge avec la résolution maximale disponible (souvent un synonyme de steady_clock).
Exemple 2 : Mesure du temps d'exécution d'une opération
#include <iostream>#include <chrono>#include <thread>
int main() { // Enregistrer le début auto start = std::chrono::steady_clock::now(); // Simulation de travail std::this_thread::sleep_for(std::chrono::milliseconds(500)); // Enregistrer la fin auto end = std::chrono::steady_clock::now(); // Calculer la différence auto duration = end - start; // Afficher le résultat en millisecondes std::cout << "Temps d'exécution : " << std::chrono::duration_cast<std::chrono::milliseconds>(duration).count() << " ms" << std::endl; return 0;}