Arbeiten mit Datumsangaben in C++: Überblick über die wichtigsten Bibliotheken
Die Arbeit mit Datum und Zeit ist eine der grundlegenden Aufgaben in der Programmierung. In C++ war die Standardbibliothek lange Zeit auf die Hilfsmittel aus C (<ctime>) beschränkt, die aus Typsicht unbequem und unsicher sind. Ab C++11 und insbesondere C++20 hat sich die Situation grundlegend geändert. In diesem Artikel betrachten wir drei Hauptansätze für die Arbeit mit Datumsangaben im modernen C++.
1. Standardbibliothek <chrono> (C++11 und C++20)
Ab C++11 wurde der Header <chrono> in die Standardbibliothek aufgenommen, der typsichere Uhren, Zeitpunkte (time_point) und Dauern (duration) bereitstellt. In C++20 wurde die Bibliothek um die Unterstützung von Kalendertypen (Jahr, Monat, Tag) und Zeitzonen erweitert.
Hauptkomponenten:
std::chrono::system_clock— Systemuhr, verbunden mit der Echtzeit.std::chrono::steady_clock— monotone Uhr zur Messung von Intervallen.std::chrono::duration— Zeitintervall (z. B. Sekunden, Millisekunden).std::chrono::time_point— ein Zeitpunkt.- Kalendertypen (C++20):
year_month_day,hh_mm_ssund andere.
#include <iostream>#include <chrono>#include <format> // C++20
int main() { using namespace std::chrono;
// Aktuelle Zeit auto now = system_clock::now(); std::cout << "Aktuelle Zeit: " << now << "";
// Umwandlung in Kalenderdatum (C++20) auto dp = floor<days>(now); year_month_day ymd{dp}; std::cout << "Jahr: " << (int)ymd.year() << "";
// Intervallmessung auto start = steady_clock::now(); // ... irgendein Code ... auto end = steady_clock::now(); auto diff = end - start; std::cout << "Vergangen: " << duration_cast<milliseconds>(diff).count() << " ms"; return 0;}Vorteile: im Standard enthalten, typsicher, wird aktiv weiterentwickelt.
Nachteile: für C++20 wird ein moderner Compiler benötigt (GCC 12+, Clang 14+, MSVC 2022).
2. Boost.DateTime
Die Bibliothek Boost.DateTime ist eine der ältesten und ausgereiftesten für die Arbeit mit Datumsangaben. Vor dem Erscheinen von C++20 war sie de facto der Standard. Sie bietet die Klassen boost::gregorian::date, boost::posix_time::ptime und vollständige Unterstützung für Zeitzonen.
Hauptfunktionen:
- Gregorianischer Kalender mit Unterstützung für Schaltjahre.
- Datumsmanipulation: Addition von Tagen, Monaten, Jahren.
- Formatierung und Parsing über
boost::date_time::date_facet. - Unterstützung für Zeitzonen über
boost::local_time.
#include <iostream>#include <boost/date_time/gregorian/gregorian.hpp>#include <boost/date_time/posix_time/posix_time.hpp>
int main() { using namespace boost::gregorian; using namespace boost::posix_time;
// Erstellen eines Datums date d(2024, 12, 25); std::cout << "Datum: " << d << ""; // 2024-Dec-25
// Addition von Tagen date next_week = d + days(7); std::cout << "In einer Woche: " << next_week << "";
// Differenz zwischen Daten days diff = next_week - d; std::cout << "Differenz: " << diff.days() << " Tage";
// Aktuelle Zeit mit Sekundengenauigkeit ptime now = second_clock::local_time(); std::cout << "Jetzt: " << now << ""; return 0;}Vorteile: bewährt, umfangreiche Dokumentation, funktioniert mit C++98.
Auch in der Bibliothek
Verarbeitung und Parsing von Markdown in PHP: Bibliotheken und Beispiele
Integration von Prometheus-Metriken in Kotlin-Anwendungen: Vollständige Anleitung
Rate Limiting in TypeScript: Bibliotheken, Strategien und Beispiele
Überwachung von TypeScript-Anwendungen: Tools und Bibliotheken
GraphQL in TypeScript: Bibliotheken für typsichere APIs