Namensräume
Varianten
Aktionen

std::formatter<std::chrono::duration>

Von cppreference.com
< cpp‎ | chrono‎ | duration
 
 
 
 
Definiert in Header <chrono>
template< class Rep, class Period, class CharT >
struct formatter<std::chrono::duration<Rep, Period>, CharT>;

Spezialisierung von std::formatter, die Formatierungsregeln für eine std::chrono::duration definiert. Die duration wird als Tageszeit seit Mitternacht interpretiert.

Die std::formatter-Spezialisierung wird normalerweise nicht direkt aufgerufen, sondern über Formatierungsfunktionen verwendet.

[bearbeiten] Formatangabe

Die Formatangabe hat die Form

fill-and-align (optional) width (optional) precision (optional) L(optional) chrono-spec (optional)

fill-and-align, width und precision haben die gleiche Bedeutung wie in der Standardformatangabe. precision ist nur für std::chrono::duration-Typen gültig, deren Repräsentationstyp Rep ein Gleitkommatyp ist, andernfalls wird std::format_error ausgelöst.

Das zur Formatierung verwendete Gebietsschema wird wie folgt bestimmt

  • das Standard-"C"-Gebietsschema, wenn L nicht in der Formatangabe enthalten ist,
  • andernfalls das Gebietsschema, das durch das an die Formatierungsfunktion übergebene std::locale bezeichnet wird, falls vorhanden,
  • andernfalls (L ist vorhanden, aber keine std::locale wird an die Formatierungsfunktion übergeben), das globale Gebietsschema.

Wenn die Kodierung des (gewöhnlichen oder breiten) Zeichenkettenliterals eine Unicode-Kodierungsform ist und das Gebietsschema zu einer implementierungsdefinierten Menge von Gebietsschemata gehört, werden jede Ersetzung, die vom Gebietsschema abhängt, so durchgeführt, als ob die Ersetzungszeichenfolge in die Literal-Kodierung konvertiert würde.

Die chrono-spec besteht aus einem oder mehreren Konvertierungsspezifizierern und gewöhnlichen Zeichen (außer {, } und %). Eine chrono-spec muss mit einem Konvertierungsspezifizierer beginnen. Alle gewöhnlichen Zeichen werden unverändert in die Ausgabe geschrieben. Jeder unveränderte Konvertierungsspezifizierer beginnt mit einem %-Zeichen, gefolgt von einem Zeichen, das das Verhalten des Spezifizierers bestimmt. Einige Konvertierungsspezifizierer haben eine modifizierte Form, bei der nach dem %-Zeichen ein E- oder O-Modifikatorzeichen eingefügt wird. Jeder Konvertierungsspezifizierer wird durch die unten beschriebenen entsprechenden Zeichen in der Ausgabe ersetzt.

Sofern nicht anders angegeben, wird, wenn die chrono-spec leer ist, das Chrono-Objekt so formatiert, als ob es mit Streamen in ein Objekt os vom Typ std::basic_ostringstream<CharT> formatiert würde, wobei das Formatierungsgebietsschema (eines von std::locale::classic(), das übergebene std::locale-Objekt und std::locale::global()) imbued wurde und os.str() mit zusätzlicher Auffüllung und Anpassungen gemäß den Formatangaben in den Ausgabepuffer kopiert wird.

Die folgenden Format-Spezifizierer sind verfügbar:

Konversion
Spezifizierer
Erklärung
%% Schreibt ein literales %-Zeichen.
%n Schreibt ein Zeilenumbruchzeichen.
%t Schreibt ein horizontalen Tabulator.
Tageszeit
%H
%OH
Schreibt die Stunde (24-Stunden-Format) als Dezimalzahl. Wenn das Ergebnis einstellig ist, wird es mit 0 vorangestellt.

Der modifizierte Befehl %OH schreibt die alternative Darstellung des Gebietsschemas.

%I
%OI
Schreibt die Stunde (12-Stunden-Format) als Dezimalzahl. Wenn das Ergebnis einstellig ist, wird es mit 0 vorangestellt.

Der modifizierte Befehl %OI schreibt die alternative Darstellung des Gebietsschemas.

%M
%OM
Schreibt die Minute als Dezimalzahl. Wenn das Ergebnis einstellig ist, wird es mit 0 vorangestellt.

Der modifizierte Befehl %OM schreibt die alternative Darstellung des Gebietsschemas.

%S
%OS
Schreibt die Sekunde als Dezimalzahl. Wenn die Anzahl der Sekunden kleiner als 10 ist, wird das Ergebnis mit 0 vorangestellt.

Wenn die Präzision der Eingabe nicht exakt mit Sekunden dargestellt werden kann, ist das Format eine Dezimalzahl mit Festkommaformat und einer Präzision, die der Präzision der Eingabe entspricht (oder einer Mikrosekundenpräzision, wenn die Konvertierung in Dezimalsekunden mit Gleitkommazahl nicht innerhalb von 18 Nachkommastellen erfolgen kann). Das Dezimaltrennzeichen wird gemäß dem Gebietsschema lokalisiert.

Der modifizierte Befehl %OS schreibt die alternative Darstellung des Gebietsschemas.

%p Schreibt die Bezeichnung für AM/PM des Gebietsschemas für eine 12-Stunden-Uhr.
%R Entspricht "%H:%M".
%T Entspricht "%H:%M:%S".
%r Schreibt die 12-Stunden-Uhrzeit des Gebietsschemas.
%X
%EX
Schreibt die Zeitdarstellung des Gebietsschemas.

Der modifizierte Befehl %EX schreibt die alternative Zeitdarstellung des Gebietsschemas.

Anzahl der Ticks der Dauer
%Q Schreibt die Anzahl der Ticks der Dauer, d.h. den Wert, der über count() erhalten wird.
%q Schreibt das Einheitensuffix der Dauer, wie in operator<<() angegeben.

Die folgenden Spezifizierer werden erkannt, führen aber zu einem std::format_error-Fehler

Konversion
Spezifizierer
Erklärung
Jahr
%C
%EC
Schreibt das Jahr geteilt durch 100 mittels abgerundeter Division. Wenn das Ergebnis einstellig ist, wird es mit 0 vorangestellt.

Der modifizierte Befehl %EC schreibt die alternative Darstellung des Jahrhunderts des Gebietsschemas.

%y
%Oy
%Ey
Schreibt die letzten beiden Dezimalziffern des Jahres. Wenn das Ergebnis einstellig ist, wird es mit 0 vorangestellt.

Der modifizierte Befehl %Oy schreibt die alternative Darstellung des Gebietsschemas.

Der modifizierte Befehl %Ey schreibt die alternative Darstellung des Offsets vom %EC (nur das Jahr) des Gebietsschemas.

%Y
%EY
Schreibt das Jahr als Dezimalzahl. Wenn das Ergebnis weniger als vier Ziffern hat, wird es mit Nullen auf vier Ziffern aufgefüllt.

Der modifizierte Befehl %EY schreibt die alternative vollständige Jahresdarstellung des Gebietsschemas.

Monat
%b
%h
Schreibt den abgekürzten Monatsnamen des Gebietsschemas.
%B Schreibt den vollständigen Monatsnamen des Gebietsschemas.
%m
%Om
Schreibt den Monat als Dezimalzahl (Januar ist 01). Wenn das Ergebnis einstellig ist, wird es mit 0 vorangestellt.

Der modifizierte Befehl %Om schreibt die alternative Darstellung des Gebietsschemas.

Tag
%d
%Od
Schreibt den Tag des Monats als Dezimalzahl. Wenn das Ergebnis einstellig ist, wird es mit 0 vorangestellt.

Der modifizierte Befehl %Od schreibt die alternative Darstellung des Gebietsschemas.

%e
%Oe
Schreibt den Tag des Monats als Dezimalzahl. Wenn das Ergebnis einstellig ist, wird es mit einem Leerzeichen vorangestellt.

Der modifizierte Befehl %Oe schreibt die alternative Darstellung des Gebietsschemas.

Wochentag
%a Schreibt den abgekürzten Wochentagsnamen des Gebietsschemas.
%A Schreibt den vollständigen Wochentagsnamen des Gebietsschemas.
%u
%Ou
Schreibt den ISO-Wochentag als Dezimalzahl (1-7), wobei Montag 1 ist.

Der modifizierte Befehl %Ou schreibt die alternative Darstellung des Gebietsschemas.

%w
%Ow
Schreibt den Wochentag als Dezimalzahl (0-6), wobei Sonntag 0 ist.

Der modifizierte Befehl %Ow schreibt die alternative Darstellung des Gebietsschemas.

ISO 8601 wochenbasierendes Jahr

In ISO 8601 beginnen Wochen mit Montag, und die erste Woche des Jahres muss die folgenden Anforderungen erfüllen:

  • Enthält den 4. Januar
  • Enthält den ersten Donnerstag des Jahres
%g Schreibt die letzten beiden Dezimalziffern des ISO 8601 wochenbasierten Jahres. Wenn das Ergebnis einstellig ist, wird es mit 0 vorangestellt.
%G Schreibt das ISO 8601 wochenbasierte Jahr als Dezimalzahl. Wenn das Ergebnis weniger als vier Ziffern hat, wird es mit Nullen auf vier Ziffern aufgefüllt.
%V
%OV
Schreibt die ISO 8601 Kalenderwoche des Jahres als Dezimalzahl. Wenn das Ergebnis einstellig ist, wird es mit 0 vorangestellt.

Der modifizierte Befehl %OV schreibt die alternative Darstellung des Gebietsschemas.

Woche/Tag des Jahres
%j Schreibt den Tag des Jahres als Dezimalzahl (1. Januar ist 001). Wenn das Ergebnis weniger als drei Ziffern hat, wird es mit Nullen auf drei Ziffern aufgefüllt.
%U
%OU
Schreibt die Kalenderwoche als Dezimalzahl. Der erste Sonntag des Jahres ist der erste Tag der Woche 01. Tage desselben Jahres davor gehören zur Woche 00. Wenn das Ergebnis einstellig ist, wird es mit 0 vorangestellt.

Der modifizierte Befehl %OU schreibt die alternative Darstellung des Gebietsschemas.

%W
%OW
Schreibt die Kalenderwoche als Dezimalzahl. Der erste Montag des Jahres ist der erste Tag der Woche 01. Tage desselben Jahres davor gehören zur Woche 00. Wenn das Ergebnis einstellig ist, wird es mit 0 vorangestellt.

Der modifizierte Befehl %OW schreibt die alternative Darstellung des Gebietsschemas.

Datum
%D Entspricht "%m/%d/%y".
%F Entspricht "%Y-%m-%d".
%x
%Ex
Schreibt die Datumsdarstellung des Gebietsschemas.

Der modifizierte Befehl %Ex erzeugt die alternative Datumsdarstellung des Gebietsschemas.

Zeitzone
%z
%Ez
%Oz
Schreibt den Offset von UTC im ISO 8601-Format. Zum Beispiel bezieht sich -0430 auf 4 Stunden und 30 Minuten hinter UTC. Wenn der Offset null ist, wird +0000 verwendet.

Die modifizierten Befehle %Ez und %Oz fügen einen Doppelpunkt : zwischen Stunden und Minuten ein (z. B. -04:30).

%Z Schreibt die Zeitzonenabkürzung.
Sonstiges
%c
%Ec
Schreibt die Datums- und Zeitdarstellung des Gebietsschemas.

Der modifizierte Befehl %Ec schreibt die alternative Datums- und Zeitdarstellung des Gebietsschemas.

[bearbeiten] Beispiel

#include <chrono>
#include <print>
using namespace std::chrono_literals;
 
int main()
{
    auto du{3h + 2min + 1s};
 
    std::print(
        "Duration is:\n"
        "{}\n"
        "{:%T}\n"
        "{:%H:%M:%S}\n"
        "{:%H hours %M minutes %S seconds}\n",
        du, du, du, du);
}

Mögliche Ausgabe

Duration is:
10921s
03:02:01
03:02:01
03 hours 02 minutes 01 seconds

[bearbeiten] Siehe auch

(C++20)
speichert die formatierte Darstellung der Argumente in einem neuen String
(Funktionstemplate) [bearbeiten]