Arbeiten mit Daten in C++: Überblick über moderne Bibliotheken
Die Arbeit mit Datum und Uhrzeit ist eine der Kernaufgaben in der Softwareentwicklung. In C++ gab es lange Zeit keine praktische Standardwerkzeuge, was zur Verwendung von C-Funktionen (ctime, localtime) oder Drittanbieterlösungen führte. Mit der Einführung des Standards C++11 und späterer Versionen hat sich die Situation jedoch grundlegend geändert. In diesem Artikel betrachten wir drei Hauptansätze für die Arbeit mit Daten in C++: die Standardbibliothek std::chrono, die Erweiterung date.h von Howard Hinnant und das leistungsstarke Framework Boost.DateTime.
1. Die Standardbibliothek std::chrono (C++11 und neuer)
std::chrono ist Teil der C++-Standardbibliothek und bietet Typen zur Darstellung von Zeitpunkten (time_point), Dauern (duration) und Uhren (clock). Sie eignet sich ideal zum Messen von Zeitintervallen, für die Arbeit mit Timern und hochpräzisen Verzögerungen. Bis C++20 fehlten jedoch praktische Mittel für die Arbeit mit Kalenderdaten (Tag, Monat, Jahr).
Beispiel: Messen der Ausführungszeit von Code
#include <iostream>#include <chrono>#include <thread>
int main() { auto start = std::chrono::high_resolution_clock::now();
// Arbeitsimulation 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 << "Ausführungszeit: " << duration.count() << " ms"; return 0;}Mit C++20 erhielt std::chrono Kalenderunterstützung: die Typen year, month, day, year_month_day und Operatoren für die Arbeit mit ihnen. Jetzt kann man schreiben:
#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. Die Bibliothek date.h (Howard Hinnant)
Vor der Veröffentlichung von C++20 nutzten Entwickler aktiv die Bibliothek date.h – eine einzeilige Erweiterung für std::chrono, geschrieben von Howard Hinnant. Sie bietet einen vollständigen Satz von Funktionen für die Arbeit mit Daten: Parsing, Formatierung, Berechnung der Differenz zwischen Daten, Arbeit mit Zeitzonen und sogar Unterstützung für den julianischen Kalender.
Beispiel: Parsen eines Strings in ein Datum
#include "date.h"#include <iostream>#include <sstream>
int main() { std::istringstream ss("2025-04-07"); date::sys_days tp; ss >> date::parse("%F", tp); // ISO 8601 Format auto ymd = date::year_month_day{tp}; std::cout << "Jahr: " << int(ymd.year()) << ""; return 0;}Beispiel: Altersberechnung
#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 << "Alter in Tagen: " << age.count() << ""; // Alter in Jahren (ungefähr) auto years = duration_cast<std::chrono::years>(age); std::cout << "Alter in Jahren: " << years.count() << ""; return 0;}Die Bibliothek date.h lässt sich leicht einbinden (es reicht, die Header-Datei zu kopieren) und erfordert keine Kompilierung. Sie wurde zur Grundlage für das standardmäßige std::chrono in C++2
Auch in der Bibliothek
Maschinelles Lernen mit JavaScript: Bibliotheken für Node.js — Überblick und Beispiele
JSON-Verarbeitung in Rust: serde_json, simd-json, json5 und andere Bibliotheken
Arbeiten mit XML in Java: DOM, SAX, StAX und JAXB
Überwachung von Go-Anwendungen (Golang): Bibliotheken und Tools
Conan C++: Komplette Anleitung mit Beispielen