Travail avec les dates en C++ : aperçu des bibliothèques clés
La gestion des dates et de l'heure est l'une des tâches fondamentales lors du développement de toute application sérieuse. De la journalisation des événements au calcul des intervalles de temps et à la planification des tâches, C++ offre au développeur plusieurs outils puissants. Dans cet article, nous examinerons trois approches principales : la bibliothèque standard moderne std::chrono, l'extension de Howard Hinnant (partiellement intégrée dans C++20) et l'éprouvée Boost.DateTime.
1. Bibliothèque standard : std::chrono (C++11 et versions ultérieures)
Depuis C++11, le travail avec le temps dans la bibliothèque standard est devenu beaucoup plus pratique. std::chrono fournit des types pour représenter les instants (time_point), les durées (duration) et les horloges (clock). Cependant, jusqu'à C++20, il ne disposait pas d'outils pratiques pour travailler avec les dates calendaires (jour, mois, année).
Composants principaux :
- Horloges (Clocks) :
system_clock(heure système),steady_clock(temps monotone pour les mesures),high_resolution_clock(généralement un alias de l'une des précédentes). - Durées (Durations) :
std::chrono::seconds,milliseconds,microseconds, etc. Permettent d'effectuer des opérations arithmétiques. - Instants (Time points) : Lien d'une durée à un point de départ spécifique (époque) de l'horloge.
Exemple : mesure du temps d'exécution
#include <iostream>#include <chrono>#include <thread>
int main() { auto start = std::chrono::high_resolution_clock::now(); 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;}Ce code démontre une mesure précise du temps avec une exactitude à la milliseconde. Pour travailler avec les dates calendaires dans C++20, de nouvelles fonctionnalités sont apparues, mais si vous utilisez une norme plus ancienne, les bibliothèques suivantes vous seront utiles.
2. Bibliothèque "date" de Howard Hinnant (ancêtre de C++20)
Avant la sortie de C++20, Howard Hinnant a créé la bibliothèque date, qui est devenue le standard de facto pour travailler avec les dates calendaires. Elle est légère, ne nécessite pas Boost et fonctionne au-dessus de std::chrono. Une grande partie de ses fonctionnalités a été intégrée dans C++20, mais la bibliothèque elle-même reste pertinente pour les projets utilisant C++11/14/17.
Fonctionnalités principales :
- Types
year_month_day,year_month,weekday. - Analyse des dates à partir de chaînes (
parse). - Formatage des dates (
format). - Addition/soustraction de jours, mois, années.
- Prise en charge des fuseaux horaires (extension
tz.h).
Exemple : travail avec les dates
#include <iostream>#include <date/date.h>#include <chrono>
int main() { using namespace date; using namespace std::chrono; // Création d'une date : 15 mars 2025 auto d1 = 2025_y / March / 15; std::cout << "Date : " << d1 << ""; // Ajout de 30 jours auto d2 = d1 + days{30}; std::cout << "Dans 30 jours : " << d2 << ""; // Différence en jours auto diff = (d2 - d1).count(); std::cout << "Différence : " << diff << " jours"; // Obtention de la date actuelle auto today = floor<days>(system_clock::now()); std::cout << "Aujourd'hui : " << year_month_day{today} << ""; return 0;}Cette