Travailler avec les dates et l'heure en C++ : de <ctime> au moderne <chrono>
Travailler avec les dates et l'heure est l'une des tâches clés dans toute application sérieuse : des logs et sauvegardes aux minuteurs et calculs financiers. En C++, deux approches ont historiquement émergé : l'approche classique de style C via le fichier d'en-tête <ctime> et l'approche moderne, type-safe via la bibliothèque <chrono>, apparue en C++11 et considérablement étendue en C++20. Dans cet article, nous analyserons les deux méthodes, apprendrons à obtenir l'heure actuelle, mesurer des intervalles, formater des dates et éviter les erreurs typiques.
1. La méthode classique : <ctime> et std::time_t
Avant C++11, la seule manière standard de travailler avec l'heure était les fonctions du C : time(), localtime(), strftime(). Cette approche est encore utilisée dans le code legacy et les tâches simples.
Obtenir l'heure actuelle
La fonction std::time(nullptr) renvoie le nombre de secondes depuis le 1er janvier 1970 (époque Unix) sous forme d'un entier std::time_t.
#include <iostream>#include <ctime>
int main() { std::time_t now = std::time(nullptr); std::cout << "Heure actuelle (secondes depuis l'époque) : " << now << std::endl; return 0;}Conversion en format lisible
Pour obtenir une structure avec les composants (année, mois, jour, heures, etc.), utilisez std::localtime() ou std::gmtime().
#include <iostream>#include <ctime>
int main() { std::time_t now = std::time(nullptr); std::tm* local = std::localtime(&now);
std::cout << "Année : " << (local->tm_year + 1900) << std::endl; std::cout << "Mois : " << (local->tm_mon + 1) << std::endl; std::cout << "Jour : " << local->tm_mday << std::endl; return 0;}Formatage de chaîne avec strftime
La fonction std::strftime() permet de formater flexiblement une date en une chaîne selon un modèle donné.
#include <iostream>#include <ctime>
int main() { std::time_t now = std::time(nullptr); std::tm* local = std::localtime(&now);
char buffer[80]; std::strftime(buffer, sizeof(buffer), "%d.%m.%Y %H:%M:%S", local); std::cout << "Date et heure actuelles : " << buffer << std::endl; return 0;}⚠️ Important : std::localtime() et std::gmtime() renvoient un pointeur vers un tampon statique — ce n'est pas thread-safe. En C++11, des versions réentrantes sont apparues : localtime_s (Windows) ou localtime_r (POSIX).
2. C++ moderne : la bibliothèque <chrono>
La bibliothèque <chrono> offre un typage strict, la gestion de différentes unités de temps et une haute précision. Les composants principaux :
- Horloges (clocks) :
system_clock,steady_clock,high_resolution_clock - Instants temporels (time_point) : liaison à un moment spécifique
- Durées (duration) : intervalles de temps (secondes, millisecondes, etc.)
Obtenir l'instant actuel
#include <iostream>#include <chrono>#include <ctime> // pour std::time_t
int main() { auto now = std::chrono::system_clock::now(); std::time_t now_time = std::chrono::system_clock::to_time_t(now); std::cout << "Heure actuelle : " << std::ctime(&now_time); return 0;}Mesure des intervalles de temps (minuteur)
L'une des tâches les plus courantes est de mesurer le temps d'exécution du code. Pour cela, il est idéal d'utiliser