Fortgeschrittene Arbeit mit Datum und Uhrzeit in C++: von chrono bis zu Zeitzonen
\n\nDie Arbeit mit Datum und Uhrzeit ist eine der Kernaufgaben bei der Entwicklung von hochbelasteten Systemen, Logging, Finanzanwendungen und Planern. In C++ bietet die Standardbibliothek ein leistungsstarkes Toolkit, angefangen bei einfachen time_t bis hin zum modernen <chrono>. In diesem Artikel werden wir fortgeschrittene Techniken behandeln: präzise Messungen, Zeitzonen, Formatierung und Intervallberechnungen.
1. Die chrono-Bibliothek: duration, time_point und clocks
\n\nDie Standardbibliothek <chrono> (C++11 und neuer) bietet Typen zur Darstellung von Zeitpunkten (time_point), Dauern (duration) und Uhren (clock). Dies ermöglicht das Schreiben von plattformunabhängigem Code.
#include <iostream>\n#include <chrono>\n#include <thread>\n\nint main() {\n using namespace std::chrono;\n\n // Startzeit messen\n auto start = high_resolution_clock::now();\n\n // Arbeit simulieren\n std::this_thread::sleep_for(milliseconds(500));\n\n auto end = high_resolution_clock::now();\n\n // Dauer berechnen\n auto duration = duration_cast<milliseconds>(end - start);\n std::cout << "Vergangen: " << duration.count() << " ms\\n";\n\n // Arbeiten mit duration in verschiedenen Einheiten\n seconds sec(1);\n milliseconds ms = sec; // implizite Konvertierung (ohne Verlust)\n // milliseconds ms2 = duration_cast<milliseconds>(sec); // explizit\n std::cout << "1 Sekunde = " << ms.count() << " ms\\n";\n\n return 0;\n}\n\nWichtige Punkte:
\n- \n
duration_cast— Konvertierung zwischen Einheiten (kann Genauigkeit verlieren). \n high_resolution_clock— die genaueste Uhr (normalerweise ein Wrapper um den Systemtimer). \n system_clock— Systemzeit, an den Kalender gebunden. \n steady_clock— monotone Uhr, ideal für Intervallmessungen. \n
2. Systemzeit und Konvertierung in Kalenderdaten
\n\nFür die Arbeit mit Kalenderdaten (Jahr, Monat, Tag) verwenden Sie system_clock und die Funktionen to_time_t / from_time_t. Ab C++20 gibt es bequemere Mittel, aber wir betrachten den klassischen Ansatz.
#include <iostream>\n#include <chrono>\n#include <ctime>\n\nint main() {\n using namespace std::chrono;\n\n // Aktuelle Systemzeit\n auto now = system_clock::now();\n std::time_t now_c = system_clock::to_time_t(now);\n\n // In lokale Zeit umwandeln\n std::tm* local = std::localtime(&now_c);\n std::cout << "Lokale Zeit: " \n << std::put_time(local, "%Y-%m-%d %H:%M:%S") << "\\n";\n\n // time_point aus einem Kalenderdatum erstellen (C++20 wird es vereinfachen)\n std::tm date = {};\n date.tm_year = 2025 - 1900; // Jahre ab 1900\n date.tm_mon = 3; // April (0-11)\n date.tm_mday = 15;\n date.tm_hour = 12;\n date.tm_min = 30;\n date.tm_sec = 0;\n std::time_t date_c = std::mktime(&date);\n auto date_point = system_clock::from_time_t(date_c);\n\n // Differenz in Tagen\n auto diff = duration_cast<hours>(now - date_point).count() / 24;\n std::cout << "Tage seit dem 15.04.2025: " << diff << "\\n";\n\n return 0;\n}\n\nWichtig: std::put_time ist seit C++11 verfügbar. Die Formatspezifizierer sind analog zu strftime.
3. Zeitzonen und C++20
\n\nVor C++20 war die Arbeit mit Zeitzonen nicht trivial. In C++20 wurde die Bibliothek <chrono> um Unterstützung für time_zone und zoned_time erweitert. Wenn Ihr Compiler C++20 unterstützt (GCC 12+, Clang 15+, MSVC 2022 17.4+), können Sie