Arbeiten mit Datum und Zeit in C++: von <ctime> bis zum modernen <chrono>
Arbeiten mit Datum und Zeit ist eine der zentralen Aufgaben in jeder ernsthaften Anwendung: von Logs und Backups bis hin zu Timern und Finanzberechnungen. In C++ haben sich historisch zwei Ansätze entwickelt: der klassische C-Stil über die Header-Datei <ctime> und der moderne, typsichere Ansatz über die Bibliothek <chrono>, die in C++11 eingeführt und in C++20 erheblich erweitert wurde. In diesem Artikel werden wir beide Methoden behandeln, lernen, wie man die aktuelle Zeit erhält, Intervalle misst, Daten formatiert und typische Fehler vermeidet.
1. Der klassische Weg: <ctime> und std::time_t
Vor C++11 waren die einzigen Standardmethoden zur Arbeit mit Zeit die Funktionen aus C: time(), localtime(), strftime(). Dieser Ansatz wird bis heute in Legacy-Code und einfachen Aufgaben verwendet.
Aktuelle Zeit abrufen
Die Funktion std::time(nullptr) gibt die Anzahl der Sekunden seit dem 1. Januar 1970 (Unix-Epoche) als Ganzzahl std::time_t zurück.
#include <iostream>#include <ctime>
int main() { std::time_t now = std::time(nullptr); std::cout << "Aktuelle Zeit (Sekunden seit Epoche): " << now << std::endl; return 0;}Umwandlung in ein lesbares Format
Um eine Struktur mit Komponenten (Jahr, Monat, Tag, Stunden usw.) zu erhalten, verwenden Sie std::localtime() oder std::gmtime().
#include <iostream>#include <ctime>
int main() { std::time_t now = std::time(nullptr); std::tm* local = std::localtime(&now);
std::cout << "Jahr: " << (local->tm_year + 1900) << std::endl; std::cout << "Monat: " << (local->tm_mon + 1) << std::endl; std::cout << "Tag: " << local->tm_mday << std::endl; return 0;}Formatierung eines Strings mit strftime
Die Funktion std::strftime() ermöglicht es, ein Datum flexibel nach einem bestimmten Muster in einen String zu formatieren.
#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 << "Aktuelles Datum und Uhrzeit: " << buffer << std::endl; return 0;}⚠️ Wichtig: std::localtime() und std::gmtime() geben einen Zeiger auf einen statischen Puffer zurück – dies ist nicht threadsicher. In C++11 sind die reentranten Versionen localtime_s (Windows) oder localtime_r (POSIX) verfügbar.
2. Modernes C++: Die Bibliothek <chrono>
Die Bibliothek <chrono> bietet strenge Typisierung, Arbeit mit verschiedenen Zeiteinheiten und hohe Genauigkeit. Die Hauptkomponenten sind:
- Uhren (clocks):
system_clock,steady_clock,high_resolution_clock - Zeitpunkte (time_point): Bindung an einen bestimmten Moment
- Dauern (duration): Zeitintervalle (Sekunden, Millisekunden usw.)
Aktuellen Zeitpunkt abrufen
#include <iostream>#include <chrono>#include <ctime> // für 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 << "Aktuelle Zeit: " << std::ctime(&now_time); return 0;}Messen von Zeitintervallen (Timer)
Eine der häufigsten Aufgaben ist das Messen der Ausführungszeit von Code. Dafür eignet sich perfekt