namespace cpp

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


kennen:include:chrono

<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';
} 
kennen/include/chrono.txt · Zuletzt geändert: 2015-01-26 14:41 (Externe Bearbeitung)