Travail avec les dates en C++ : aperçu des bibliothèques modernes
Le travail avec les dates et l'heure est l'une des tâches clés dans le développement de logiciels. En C++, il n'y a pas eu pendant longtemps d'outillage standard pratique, ce qui a conduit à l'utilisation de fonctions C (ctime, localtime) ou de solutions tierces. Cependant, avec l'arrivée de la norme C++11 et des versions ultérieures, la situation a radicalement changé. Dans cet article, nous examinerons trois approches principales pour travailler avec les dates en C++ : la bibliothèque standard std::chrono, l'extension date.h de Howard Hinnant et le puissant framework Boost.DateTime.
1. Bibliothèque standard std::chrono (C++11 et plus récent)
std::chrono fait partie de la bibliothèque standard C++, fournissant des types pour représenter les points temporels (time_point), les durées (duration) et les horloges (clock). Elle est idéale pour mesurer des intervalles de temps, travailler avec des minuteurs et des délais de haute précision. Cependant, jusqu'à C++20, elle ne disposait pas d'outils pratiques pour travailler avec les dates calendaires (jour, mois, année).
Exemple : mesure du temps d'exécution du code
#include <iostream>#include <chrono>#include <thread>
int main() { auto start = std::chrono::high_resolution_clock::now();
// Simulation de travail std::this_thread::sleep_for(std::chrono::milliseconds(500));
auto end = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
std::cout << "Temps d'exécution : " << duration.count() << " ms"; return 0;}Avec C++20, std::chrono a reçu le support du calendrier : les types year, month, day, year_month_day et les opérateurs pour travailler avec eux. On peut maintenant écrire :
#include <chrono>#include <iostream>
int main() { using namespace std::chrono; auto today = floor<days>(system_clock::now()); year_month_day ymd{today}; std::cout << int(ymd.year()) << "-" << unsigned(ymd.month()) << "-" << unsigned(ymd.day()) << ""; return 0;}2. Bibliothèque date.h (Howard Hinnant)
Avant la sortie de C++20, les développeurs utilisaient activement la bibliothèque date.h — une extension en un seul fichier pour std::chrono, écrite par Howard Hinnant. Elle fournit un ensemble complet de fonctions pour travailler avec les dates : analyse syntaxique, formatage, calcul de la différence entre les dates, travail avec les fuseaux horaires et même le support du calendrier julien.
Exemple : analyse syntaxique d'une chaîne en date
#include "date.h"#include <iostream>#include <sstream>
int main() { std::istringstream ss("2025-04-07"); date::sys_days tp; ss >> date::parse("%F", tp); // Format ISO 8601 auto ymd = date::year_month_day{tp}; std::cout << "Année : " << int(ymd.year()) << ""; return 0;}Exemple : calcul de l'âge
#include "date.h"#include <iostream>
int main() { using namespace date; auto birth = sys_days{year{1990}/month{1}/day{15}}; auto today = floor<days>(std::chrono::system_clock::now()); auto age = today - birth; std::cout << "Âge en jours : " << age.count() << ""; // Âge en années (approximatif) auto years = duration_cast<std::chrono::years>(age); std::cout << "Âge en années : " << years.count() << ""; return 0;}La bibliothèque date.h se connecte facilement (il suffit de copier le fichier d'en-tête) et ne nécessite pas de compilation. Elle est devenue la base du std::chrono standard en C++2