Einleitung: Warum die Standard-Zeitverarbeitung in C++ komplexer (und besser) geworden ist
Lange Zeit beschränkte sich die Arbeit mit Datum und Zeit in C++ auf die Verwendung von Funktionen aus <ctime>: time(), localtime(), strftime(). Dies reichte für einfache Aufgaben aus, aber mit der zunehmenden Komplexität von Projekten (verteilte Systeme, stark ausgelastete Server, Finanzanwendungen) wurden präzisere, sicherere und benutzerfreundlichere Werkzeuge benötigt.
Der Standard C++11 bescherte uns die Bibliothek <chrono>, die Probleme wie Überläufe, Verwechslungen von Maßeinheiten und Plattformabhängigkeit löst. C++20 machte einen wichtigen Schritt nach vorne, indem es Unterstützung für Zeitzonen, Kalendertypen und Formatierung über std::format hinzufügte. In diesem Artikel betrachten wir fortgeschrittene Techniken, die über das banale Abrufen der aktuellen Zeit hinausgehen.
1. Die chrono-Bibliothek: Von Millisekunden zu Nanosekunden und Kalendern
Der Kern von std::chrono besteht aus drei Komponenten: Uhr (clock), Dauer (duration) und Zeitpunkt (time_point). Auf fortgeschrittenem Niveau ist es wichtig, die richtige Uhr auszuwählen und mit Zeitarithmetik umzugehen.
1.1. Auswahl der Uhr: system_clock, steady_clock, high_resolution_clock
system_clock— repräsentiert die Systemzeit (Kalenderzeit). Kann vom Benutzer oder einem Synchronisationsdienst (NTP) angepasst werden. Wird zur Anzeige des Datums für den Benutzer verwendet.steady_clock— monotone Uhr. Wird niemals zurückgesetzt (no rollback). Ideal zum Messen von Intervallen (Timer, Profiling).high_resolution_clock— Uhr mit dem kleinstmöglichen Takt. Auf den meisten Plattformen ist dies ein Synonym fürsteady_clock.
Fortgeschrittener Tipp: Verwenden Sie high_resolution_clock niemals für Profiling, wenn Sie Stabilität benötigen. Verwenden Sie steady_clock.
1.2. Arbeiten mit duration und time_point
Fortgeschrittene Arbeit bedeutet nicht nur das Messen von Zeit, sondern auch die Umrechnung zwischen Einheiten, Arithmetik und benutzerdefinierte Typen.
#include <iostream>#include <chrono>#include <thread>
int main() { using namespace std::chrono_literals; // für Suffixe ms, s, us
// Fortgeschrittene Erstellung von duration auto work_time = 2h + 30min + 15s; // 2 Stunden 30 Minuten 15 Sekunden std::cout << "Arbeitszeit in Sekunden: " << work_time.count() << " s";
// Umrechnung mit Rundung (duration_cast) auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(work_time); std::cout << "In Millisekunden: " << ms.count() << " ms";
// Messung der Ausführungszeit einer Funktion auto start = std::chrono::steady_clock::now(); std::this_thread::sleep_for(100ms); // simuliert Arbeit auto end = std::chrono::steady_clock::now(); auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start); std::cout << "Funktion ausgeführt in: " << elapsed.count() << " µs";
return 0;}1.3. Kalendertypen (C++20)
C++20 fügte year_month_day, year_month, weekday und andere hinzu. Dies ermöglicht eine sichere Manipulation von Daten ohne Arbeit mit rohen Zahlen.
#include <iostream>#include <chrono>
int main() { using namespace std::chrono;
// Erstellung eines Datums auto date = 2023y / October / 15d; // 15. Oktober 2023 std::cout << "Datum: " << date << '';
// Hinzufügen von Tagen auto next_week = date + days(7); std::cout << "In einer Woche: " << next_week << '';
// Abrufen des Wochentags weekday wd{date}; std::cout <&l