Inhaltsverzeichnis
<chrono>
Die Bibliothek definiert Typen für Zeitspannen, Zeitpunkte und Uhren im Namensraum std::chrono
unabhängig von den im Lauf der Jahrzehnte immer mehr verkürzten Rechnertakten.
Zeitspannen
Zeitspannen der Schablone duration<Tickzahl, Zeiteinheit>
werden als Zahlen (Ticks) einer Zeiteinheit dargestellt.
Die Typen hours
, minutes
, seconds
, milliseconds
, microseconds
, nanoseconds
sind als Ganzzahlverhältnisse std::ratio<z,n> von Sekunden definiert.
#include <chrono> double bilderProTag() { using namespace std::chrono; seconds day = hours(23) + minutes(56) + seconds(4); milliseconds ms = day; duration<double, std::ratio<1,24>> pics = day; return pics.count(); }
Grundrechenoperationen und Vergleiche erfolgen weitgehend beim Übersetzen. Die Umrechnung in kleinere Zeitspanne-Einheiten ist immer möglich, umgekehrt jedoch nur in Gleitkommatypen oder durch einen Cast:
nanoseconds ns = ms; minutes m = duration_cast<minutes>(ms); // abrunden
Uhren
Die Zeitmessung mit einer Uhr geht von einem willkürlich festgelegten Anfangszeitpunkt (Epoche) aus.
Jede Uhrklasse besitzt einen Zahltyp rep
, einen Verhältniszahltyp period
, einen Zeitdauertyp duration
,
einen Typ für Zeitpunkte time_point
und eine statische Klassenfunktion now()
,
die den aktuellen Zeitpunkt als Zeitspanne seit Beginn der Epoche liefert.
Die Uhrtypen system_clock
und high_resolution_clock
sind vordefiniert.
Bei steady_clock
sind zudem garantiert, dass die von ihr nacheinander gelieferten Zeitpunkte niemals "rückwärts" laufen.
Die Auflösegenauigkeit einer Uhr kann weniger als eine Nanosekunde betragen:
template <class Clock> double precision_in_nanoseconds() { Clock::duration tick(1); std::chrono::duration<double, std::nano> ns = tick; return ns.count(); }
Zeitpunkte
Zeitpunkte time_point<Uhr, Zeitspanne>
sind auf ihre Uhr bezogen:
template <class Clock> Clock::rep ticks() { typename Clock::time_point epoch, now = Clock::now(); typename Clock::duration gone = now.time_since_epoch(); return gone.count(); }
Die Differenz zweier Zeitpunkte ist die Zeitspanne d = t2-t1
.
Zu einem Zeitpunkt lässt sich eine Zeitspanne addieren oder subtrahieren.
Dies liefert wiederum einen Zeitpunkt t2 = t1+d
.
Vergleiche t1 < t2
erlauben Formulierungen wie "davor" und "danach".
Umwandlung in Zeitstempel
Die Umwandlung in ein Datum und die Anzeige sind in <chrono>
nicht festgelegt.
Dafür muss auf die Mittel der Bibliothek <ctime> und I/O-Manipulatoren zurückgegriffen werden:
#include <iostream> #include <iomanip> // put_time() void vorbei() { using namespace std::chrono; system_clock::time_point gestern = system_clock::now() - hours(24); std::time_t t = system_clock::to_time_t(gestern); std::cout << "gestern zur selben Zeit: " << std::put_time(std::localtime(&t), "%F %T") << '\n'; }