Arbeiten mit Datum und Uhrzeit in C++: Fortgeschrittenes Niveau

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Fortgeschrittene Arbeit mit Datum und Uhrzeit in C++: von chrono bis zu Zeitzonen

\n\n

Die 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.

\n\n

1. Die chrono-Bibliothek: duration, time_point und clocks

\n\n

Die 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.

\n\n
#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\n

Wichtige 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
\n\n

2. Systemzeit und Konvertierung in Kalenderdaten

\n\n

Fü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.

\n\n
#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\n

Wichtig: std::put_time ist seit C++11 verfügbar. Die Formatspezifizierer sind analog zu strftime.

\n\n

3. Zeitzonen und C++20

\n\n

Vor 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

Blogs

Buchempfehlungen