Fortgeschrittene Arbeit mit Datum und Zeit in C++: chrono, time_t und Parsing

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

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ür steady_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

Blogs

Buchempfehlungen