Zeit in C++20: Chrono I/O
![](https://heise.cloudimg.io/width/700/q75.png-lossy-75.webp-lossy-75.foil1/_www-heise-de_/imgs/18/4/5/9/3/0/7/2/shutterstock_766847608-1a58844c5ec29b79.jpeg)
(Bild: Min C. Chiu/Shutterstock.com)
Chrono I/O umfasst das Lesen und Schreiben von Chronotypen. Die Datentypen unterstützen unformatiertes und formatiertes Schreiben mit der neuen Bibliothek.
Dieser Artikel ist der neunte in meiner ausführlichen Reise durch die Chrono-Erweiterung in C++20:
- Zeit in C++20: Einführung in die Chrono-Terminologie [1]
- Zeit in C++20: Einführung in die Chrono-Terminologie mit Zeitdauer und Zeitpunkt [2]
- Zeit in C++20: Neue Datentypen für die Tageszeit und das Kalenderdatum [3]
- Zeit in C++20: Kalendertermine erstellen [4]
- Zeit in C++20: Kalendertermine darstellen und prüfen [5]
- Zeit in C++20: Kalenderdaten abfragen und Ordinaldaten [6]
- Zeit in C++20: Details zu der Arbeit mit Zeitzonen [7]
- Zeitzonen in C++20: Online-Klassen [8]
![](https://heise.cloudimg.io/width/696/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/imgs/18/4/5/9/3/0/7/2/TimelineCpp20CoreLanguage-1529a6191e572b4f.png)
Ausgabe
Die meisten Datentypen, wie z.B. Zeitdauer, Zeitpunkte und Kalenderdaten, können ohne Formatangabe direkt geschrieben werden.
Unformatiert
Die nachfolgende Tabelle zeigt das Standardausgabeformat. Beginnen wir mit den Zeitdauern.
![](https://heise.cloudimg.io/width/696/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/imgs/18/4/5/9/3/0/7/2/TimeDuration-b2ca73063bf3b7bc.png)
Zeitdauern
Das Programm zeigt Werte für jede Zeitdauer an.
// timeDurationsOutput.cpp
#include <chrono>
#include <iostream>
int main() {
std::cout << '\n';
using namespace std::chrono_literals;
std::cout << "5ns: " << 5ns << '\n';
std::cout << "std::chrono::nanoseconds(5): "
<< std::chrono::nanoseconds(5) << '\n';
std::cout << '\n';
std::cout << "5ms: " << 5ms << '\n';
std::cout << "std::chrono::microseconds(5): "
<< std::chrono::microseconds(5) << '\n';
std::cout << '\n';
std::cout << "5us: " << 5us << '\n';
std::cout << "std::chrono::milliseconds(5): "
<< std::chrono::milliseconds(5) << '\n';
std::cout << '\n';
std::cout << "5s: " << 5s << '\n';
std::cout << "std::chrono::seconds(5): " << std::chrono::seconds(5) << '\n';
std::cout << '\n';
std::cout << "5min: " << 5min << '\n';
std::cout << "std::chrono::minutes(5): " << std::chrono::minutes(5) << '\n';
std::cout << '\n';
std::cout << "5h: " << 5h << '\n';
std::cout << "std::chrono::hours(5): " << std::chrono::hours(5) << '\n';
std::cout << '\n';
std::cout << "std::chrono::days(5): " << std::chrono::days(5) << '\n';
std::cout << '\n';
std::cout << "std::chrono::weeks(5): " << std::chrono::weeks(5) << '\n';
std::cout << '\n';
std::cout << "std::chrono::months(5): " << std::chrono::months(5) << '\n';
std::cout << '\n';
std::cout << "std::chrono::years(5): " << std::chrono::years(5) << '\n';
std::cout << '\n';
}
![](https://heise.cloudimg.io/width/440/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/imgs/18/4/5/9/3/0/7/2/timeDurationsOutput-5df21b1d5f31a5b9.png)
Die natürlichen Zahlen in den eckigen Klammern von std::chrono::weeks
, std::chrono::months
und std::chrono::years
stehen für die Anzahl der Sekunden.
Zeitpunkte
Verwendet man die statische Mitgliedsfunktion now
der C++20-Uhren, erhält man das Datum und die Uhrzeit in dem im Listing gezeigten Format:
year-month-day hours:minutes:seconds
Das folgende Programm gibt die aktuelle Zeit mit allen C++20-Uhren an.
// timePointsOutput.cpp
#include <chrono>
#include <iostream>
int main() {
std::cout << '\n';
auto nowSystemClock = std::chrono::system_clock::now();
std::cout << "nowSystemClock: " << nowSystemClock << '\n';
auto nowSteadyClock = std::chrono::steady_clock::now();
// std::cout << "nowSteadyClock: " << nowSteadyClock << '\n'; ERROR
auto nowFileClock = std::chrono::file_clock::now();
std::cout << "nowFileClock: " << nowFileClock << '\n';
auto nowGPSClock = std::chrono::gps_clock::now();
std::cout << "nowGPSClock: " << nowGPSClock << '\n';
// auto nowlocal_tClock = std::chrono::local_t::now(); ERROR
auto nowTAIClock = std::chrono::tai_clock::now();
std::cout << "nowTAIClock: " << nowTAIClock << '\n';
auto nowUTCClock = std::chrono::utc_clock::now();
std::cout << "nowUTCClock: " << nowUTCClock << '\n';
std::cout << '\n';
}
Das Programm zeigt zwei interessante Fakten. Erstens kann die aktuelle Zeit, die von der std::chrono::steady_clock::now()
gegeben wird, nicht angezeigt werden. Zweitens hat die Pseudo-Uhr std::chrono::local_t
keine statische Mitgliedsfunktion now()
.
![](https://heise.cloudimg.io/width/479/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/imgs/18/4/5/9/3/0/7/2/timePointsOutput-9109cc57a7de6746.png)
Die GPS-Zeit ist der UTC-Zeit um 18 Sekunden voraus. Die TAI-Zeit liegt 37 Sekunden vor der UTC-Zeit und 19 Sekunden vor der GPS-Zeit.
Dank der C++17-Funktion std::chrono::floor
kann man den Zeitpunkt in verschiedenen Granularitäten darstellen. In diesem Fall muss der Zeitpunkt vom Datentyp std::chrono::local_time
sein.
// timePointsOutputGranularity.cpp
#include <chrono>
#include <iostream>
int main() {
std::cout << '\n';
auto now = std::chrono::system_clock::now();
auto zonedTime = std::chrono::zoned_time(std::chrono::current_zone(), now);
auto localTime = zonedTime.get_local_time();
std::cout << "local_time: "
<< localTime << '\n';
std::cout << "std::chrono::floor<std::chrono::microseconds>(localTime): "
<< std::chrono::floor<std::chrono::microseconds>(localTime) << '\n';
std::cout << "std::chrono::floor<std::chrono::milliseconds>(localTime): "
<< std::chrono::floor<std::chrono::milliseconds>(localTime) << '\n';
std::cout << "std::chrono::floor<std::chrono::seconds>(localTime): "
<< std::chrono::floor<std::chrono::seconds>(localTime) << '\n';
std::cout << "std::chrono::floor<std::chrono::minutes>(localTime): "
<< std::chrono::floor<std::chrono::minutes>(localTime) << '\n';
std::cout << "std::chrono::floor<std::chrono::hours>(localTime): "
<< std::chrono::floor<std::chrono::hours>(localTime) << '\n';
std::cout << "std::chrono::floor<std::chrono::days>(localTime): "
<< std::chrono::floor<std::chrono::days>(localTime) << '\n';
std::cout << "std::chrono::floor<std::chrono::weeks>(localTime): "
<< std::chrono::floor<std::chrono::weeks>(localTime) << '\n';
// std::cout << std::chrono::floor<std::chrono::months>(localTime) << '\n'; ERROR
// std::cout << std::chrono::floor<std::chrono::years>(localTime) << '\n'; ERROR
std::cout << '\n';
}
Das Programm gibt localTime
in verschiedenen Genauigkeiten an, beginnend mit der Zeitdauer std::chrono::microseconds
und endend mit std::chrono::weeks.
Seltsamerweise können die Zeitdauern für std::chrono::months
und std::chrono::years
nicht angezeigt werden. Dieses Manko soll mit C++23 behoben werden.
Wie geht's weiter?
Mein nächster Artikel beschreibt, wie sich zusätzlich auch Kalenderdaten unformatiert anzeigen lassen. (map [9])
URL dieses Artikels:
https://www.heise.de/-9723517
Links in diesem Artikel:
[1] https://www.heise.de/blog/Zeit-in-C-20-Einfuehrung-in-die-Chrono-Terminologie-9642462.html
[2] https://www.heise.de/blog/Zeit-in-C-20-Grundlegende-Chrono-Terminologie-mit-Zeitdauer-und-Zeitpunkt-9651792.html
[3] https://heise.de/-9664010
[4] https://heise.de/-9671530
[5] https://heise.de/-9684590
[6] https://heise.de/-9692091
[7] https://heise.de/-9705367
[8] https://www.heise.de/blog/Zeitzonen-in-C-20-Online-Klassen-9713375.html
[9] mailto:map@ix.de
Copyright © 2024 Heise Medien