C++20: Chrono I/O: Unformatiert und formatiert
![Bahnhofsuhr](https://heise.cloudimg.io/width/700/q75.png-lossy-75.webp-lossy-75.foil1/_www-heise-de_/imgs/18/4/6/1/1/9/6/9/DB17198-bd4e60d6bc792b0a.jpeg)
(Bild: MediaPortal der Deutschen Bahn)
Die verschiedenen Datentypen unterstützen das formatierte Schreiben mit der neuen Formatierungsbibliothek.
![](https://heise.cloudimg.io/width/696/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/imgs/18/4/6/1/1/9/6/9/TimelineCpp20CoreLanguage-1529a6191e572b4f.png)
Dieser Artikel ist der zehnte 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]
- Chrono I/O [9]
Unformatierte Kalenderdaten
Die meisten Datentypen von Chrono wie Zeitdauer, Zeitpunkte und Kalenderdaten unterstützen das direkte Schreiben ohne Formatangabe. Heute mache ich mit diesen unformatierten Kalenderdaten weiter. Die folgende Tabelle zeigt das Standardausgabeformat von Kalenderdaten.
![](https://heise.cloudimg.io/width/696/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/imgs/18/4/6/1/1/9/6/9/calendar-749b84a68604bcbd.png)
// createCalendar.cpp
#include <chrono>
#include <iostream>
int main() {
std::cout << '\n';
using namespace std::chrono_literals;
using std::chrono::last;
using std::chrono::year;
using std::chrono::month;
using std::chrono::day;
using std::chrono::year_month;
using std::chrono::year_month_day;
using std::chrono::year_month_day_last;
using std::chrono::year_month_weekday;
using std::chrono::year_month_weekday_last;
using std::chrono::month_weekday;
using std::chrono::month_weekday_last;
using std::chrono::month_day;
using std::chrono::month_day_last;
using std::chrono::weekday_last;
using std::chrono::weekday;
using std::chrono::January;
using std::chrono::February;
using std::chrono::June;
using std::chrono::March;
using std::chrono::October;
using std::chrono::Monday;
using std::chrono::Thursday;
using std::chrono::Sunday;
constexpr auto yearMonthDay{year(1940)/month(6)/day(26)}; // (1)
std::cout << yearMonthDay << " ";
std::cout << year_month_day(1940y, June, 26d) << '\n'; // (2)
std::cout << '\n';
constexpr auto yearMonthDayLast{year(2010)/March/last}; // (3)
std::cout << yearMonthDayLast << " ";
std::cout << year_month_day_last(2010y, month_day_last(month(3))) << '\n';
constexpr auto
yearMonthWeekday{year(2020)/March/Thursday[2]}; // (4)
std::cout << yearMonthWeekday << " ";
std::cout << year_month_weekday(2020y, month(March), Thursday[2]) << '\n';
constexpr auto
yearMonthWeekdayLast{year(2010)/March/Monday[last]}; //(5)
std::cout << yearMonthWeekdayLast << " ";
std::cout << year_month_weekday_last(2010y, month(March), weekday_last(Monday));
std::cout << "\n\n";
constexpr auto day_{day(19)}; // (6)
std::cout << day_ << " ";
std::cout << day(19) << '\n';
constexpr auto month_{month(1)}; // (7)
std::cout << month_ << " ";
std::cout << month(1) << '\n';
constexpr auto year_{year(1988)}; // (8)
std::cout << year_ << " ";
std::cout << year(1988) << '\n';
constexpr auto weekday_{weekday(5)};
std::cout << weekday_ << " ";
std::cout << weekday(5) << '\n';
constexpr auto yearMonth{year(1988)/1};
std::cout << yearMonth << " ";
std::cout << year_month(year(1988), January) << '\n';
constexpr auto monthDay{10/day(22)};
std::cout << monthDay << " ";
std::cout << month_day(October, day(22)) << '\n';
constexpr auto monthDayLast{June/last};
std::cout << monthDayLast << " ";
std::cout << month_day_last(month(6)) << '\n';
constexpr auto monthWeekday{2/Monday[3]};
std::cout << monthWeekday << " ";
std::cout << month_weekday(February, Monday[3]) << '\n';
constexpr auto monthWeekDayLast{June/Sunday[last]};
std::cout << monthWeekDayLast << " ";
std::cout << month_weekday_last(June, weekday_last(Sunday)) << '\n';
std::cout << '\n';
}
Hier ist die Ausgabe des Programms:
![](https://heise.cloudimg.io/width/696/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/imgs/18/4/6/1/1/9/6/9/createCalendar-59eb063484ac0022.png)
Formatierte Ausgaben
Die folgende Tabelle zeigt die Formatangaben, einschließlich einer kurzen Beschreibung und eines Beispiels. Die vollständige Beschreibung findet sich auf der Seite cppreference.com/chrono/parse. [10]
![](https://heise.cloudimg.io/width/696/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/imgs/18/4/6/1/1/9/6/9/caendarFormat.-2760fb697f44959b.png)
![](https://heise.cloudimg.io/width/696/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/imgs/18/4/6/1/1/9/6/9/time-f007640354e529ff.png)
![](https://heise.cloudimg.io/width/696/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/imgs/18/4/6/1/1/9/6/9/other-6bc6113f69d63a91.png)
Das folgende Programm verwendet die Spezifizierer für die Uhrzeit und das Kalenderdatum.
// formattedOutputChrono.cpp
#include <chrono>
#include <iostream>
#include <thread>
int main() {
std::cout << '\n';
using namespace std::literals;
auto start = std::chrono::steady_clock::now(); // (1)
std::this_thread::sleep_for(33ms);
auto end = std::chrono::steady_clock::now(); // (2)
std::cout << std::format("The job took {} seconds\n", end - start);
std::cout << std::format("The job took {:%S} seconds\n", end - start);
std::cout << '\n';
auto now = std::chrono::system_clock::now(); // (3)
std::cout << "now: " << now << '\n';
std::cout << "Specifier {:%c}: " << std::format("{:%c}\n", now);
std::cout << "Specifier {:%x}: " << std::format("{:%x}\n", now);
std::cout << "Specifier {:%F}: " << std::format("{:%F}\n", now);
std::cout << "Specifier {:%D}: " << std::format("{:%D}\n", now);
std::cout << "Specifier {:%Y}: " << std::format("{:%Y}\n", now);
std::cout << "Specifier {:%y}: " << std::format("{:%y}\n", now);
std::cout << "Specifier {:%b}: " << std::format("{:%b}\n", now);
std::cout << "Specifier {:%B}: " << std::format("{:%B}\n", now);
std::cout << "Specifier {:%m}: " << std::format("{:%m}\n", now);
std::cout << "Specifier {:%W}: " << std::format("{:%W}\n", now);
std::cout << "Specifier {:%U}: " << std::format("{:%U}\n", now);
std::cout << "Specifier {:%a}: " << std::format("{:%a}\n", now);
std::cout << "Specifier {:%A}: " << std::format("{:%A}\n", now);
std::cout << "Specifier {:%w}: " << std::format("{:%w}\n", now);
std::cout << "Specifier {:%u}: " << std::format("{:%u}\n", now);
std::cout << "Specifier {:%e}: " << std::format("{:%e}\n", now);
std::cout << "Specifier {:%d}: " << std::format("{:%d}\n", now);
std::cout << '\n';
}
![](https://heise.cloudimg.io/width/514/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/imgs/18/4/6/1/1/9/6/9/formattedOutputChrono-2c9057b7485d1eb5.png)
Der Aufruf std::chrono::steady_clock::now()
(1 und 2) bestimmt die aktuelle Zeit. Man sollte die std::chrono::steady_clock
für Messungen verwenden, da diese Uhr monoton ist und nicht angepasst werden kann, wie beispielsweise std::chrono::system_clock
(3).
Wie geht's weiter?
Im nächsten Teil geht es um den Formatspezifizierer für formatierte Eingaben.
Schulung: Embedded Programmierung mit modernem C++
- Embedded Programmierung mit modernem C++ [11]: 02.07.2024 - 04.07.2024 (Online-Schulung, Termingarantie)
(rme [12])
URL dieses Artikels:
https://www.heise.de/-9759566
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] https://www.heise.de/blog/Zeit-in-C-20-Chrono-I-O-9723517.html
[10] https://en.cppreference.com/w/cpp/chrono/parse
[11] https://www.modernescpp.de/index.php/c/2-c/49-embedded-programmierung-mit-modernem-c20240128163812
[12] mailto:rme@ix.de
Copyright © 2024 Heise Medien