Namespaces
Variants

std::time_get<CharT,InputIt>:: get, std::time_get<CharT,InputIt>:: do_get

From cppreference.net
Definiert in Header <locale>
public :

iter_type get ( iter_type beg, iter_type end, std:: ios_base & str,
std:: ios_base :: iostate & err, std:: tm * t,

const char_type * fmtbeg, const char_type * fmtend ) const ;
(1) (seit C++11)
protected :

virtual iter_type do_get ( iter_type beg, iter_type end, std:: ios_base & str,
std:: ios_base :: iostate & err, std:: tm * t,

char format, char modifier ) const ;
(2) (seit C++11)
1) Analysiert Datum und Zeit aus der Eingabezeichenfolge [ beg, end ) gemäß dem in der Zeichenfolge [ fmtbeg, fmtend ) bereitgestellten Format. Das Format wird erwartungsgemäß der nachfolgend beschriebenen Formatierung folgen, obwohl die tatsächliche Verarbeitung jedes Formatspezifizierers durch Überschreiben von do_get angepasst werden kann. Die get -Funktion führt folgende Schritte aus: Zuerst löscht sie die Fehlerbits in err durch Ausführung von err = std:: ios_base :: goodbit . Danach tritt sie in eine Schleife ein, die beendet wird, sobald eine der folgenden Bedingungen erfüllt ist (in dieser Reihenfolge geprüft):
a) Alle Zeichen wurden aus der Formatzeichenfolge gelesen ( fmtbeg == fmtend ).
b) Es ist ein Parsing-Fehler aufgetreten ( err ! = std:: ios_base :: goodbit ).
c) Alle Zeichen wurden aus der Eingabesequenz gelesen ( beg == end ). Wenn diese Bedingung die Schleife beendet, setzt die Funktion sowohl eofbit als auch failbit in err .
Im Körper der Schleife finden die folgenden Schritte statt:
a) Wenn das nächste Zeichen in der Formatzeichenfolge '%' ist, gefolgt von einem oder zwei Zeichen, die einen gültigen std::get_time Konvertierungsspezifizierer bilden (siehe unten), werden diese Zeichen im Aufruf do_get ( beg, end, str, err, t, format, modifier ) verwendet, wobei format das primäre Konvertierungsspezifizierer-Zeichen ist und modifier der optionale Modifikator (der zwischen % und dem Formatzeichen erscheint, falls vorhanden). Wenn kein Modifikator vorhanden ist, wird der Wert ' \0 ' verwendet. Wenn die Formatzeichenfolge mehrdeutig ist oder zu früh endet, um den Konvertierungsspezifizierer nach '%' zu bestimmen, wird eofbit in err gesetzt und die Schleife beendet. Wenn nach dem Aufruf von do_get keine Fehlerbits in err gesetzt sind, erhöht die Funktion fmtbeg , um direkt nach dem Konvertierungsspezifizierer zu zeigen, und setzt die Schleife fort.
b) Wenn das nächste Zeichen ein Leerzeichen ist, wie durch das im Stream bereitgestellte Locale angezeigt str (d.h. std:: isspace ( * fmtbeg, str. getloc ( ) ) == true ), inkrementiert die Funktion fmtbeg kontinuierlich, bis es entweder gleich fmtend wird oder auf ein Nicht-Leerzeichen-Zeichen zeigt.
c) Wenn das nächste Zeichen im Formatstring gemäß Groß-/Kleinschreibung-ignorierendem Vergleich dem nächsten Zeichen im Eingabestrom entspricht, erhöht die Funktion beide Sequenzen um ein Zeichen ++ fmtbeg, ++ beg ; und setzt die Schleife fort. Andernfalls setzt sie das failbit in err .
2) Verarbeitet eine Konversionsspezifikation aus der Eingabesequenz [ beg, end ) und aktualisiert die std::tm -Struktur, auf die t zeigt, entsprechend.
Zuerst löscht es die Fehlerbits in err durch Ausführung von err = std:: ios_base :: goodbit . Liest dann Zeichen aus der Eingabesequenz [ beg, end ) , die durch den std::time_get Format-Spezifizierer erwartet werden, gebildet durch Kombination von '%' , modifier (falls nicht ' \0 ' ), und format . Wenn die Zeichen keine gültige Konvertierungs-Spezifikation bilden, setzt es failbit in err . Wenn das Ende des Eingabestroms nach dem Lesen eines Zeichens erreicht wird, setzt es eofbit in err . Wenn die Eingabezeichenkette erfolgreich geparst wurde, aktualisiert es die entsprechenden Felder von * t .
Für komplexe Konvertierungsspezifizierer, wie '%x' oder '%c' , oder für Direktiven, die die Modifikatoren 'E' und 'O' verwenden, kann die Funktion möglicherweise einige der Werte nicht bestimmen, die in * t gespeichert werden sollen. In einem solchen Fall setzt sie eofbit in err und belässt diese Felder in einem nicht spezifizierten Zustand.

Inhaltsverzeichnis

Parameter

beg - Iterator, der den Beginn der zu parsenden Sequenz kennzeichnet
end - Iterator, der auf das Ende der zu parsenden Sequenz zeigt (eins hinter dem letzten Element)
str - Ein Stream-Objekt, das diese Funktion zur Beschaffung von Locale-Facets verwendet, z.B. std::ctype zum Überspringen von Leerzeichen oder std::collate zum Vergleichen von Zeichenketten
err - Stream-Fehlerflags-Objekt, das von dieser Funktion zur Fehleranzeige modifiziert wird
t - Zeiger auf das std::tm -Objekt, das das Ergebnis dieses Funktionsaufrufs enthält
fmtbeg - Zeiger auf das erste Zeichen einer Sequenz von char_type -Zeichen, die das Konvertierungsformat spezifizieren (siehe unten)
fmtend - Zeiger auf das Ende einer Sequenz von char_type -Zeichen, die das Konvertierungsformat spezifizieren (eins hinter dem letzten Zeichen)
format - Das Zeichen, das einen Konvertierungsspezifizierer benennt
modifier - Der optionale Modifikator, der zwischen % und dem Konvertierungsspezifizierer erscheinen kann


Die Formatzeichenfolge besteht aus null oder mehr Konvertierungsspezifizierern, Leerzeichen und gewöhnlichen Zeichen (außer % ). Von jedem gewöhnlichen Zeichen wird erwartet, dass es genau ein Zeichen im Eingabestrom bei Groß-/Kleinschreibung-ignorierendem Vergleich entspricht. Jedes Leerzeichen entspricht beliebigem Leerraum in der Eingabezeichenfolge. Jede Konvertierungsspezifikation beginnt mit dem % -Zeichen, optional gefolgt von einem E - oder O -Modifizierer (wird ignoriert, wenn vom Locale nicht unterstützt), gefolgt von dem Zeichen, das das Verhalten der Spezifizierung bestimmt. Die Formatspezifizierer entsprechen der POSIX-Funktion strptime() :

Konvertierungsspezifizierer
Erklärung Schreibt in Felder
% entspricht einem wörtlichen % . Die vollständige Konvertierungsspezifikation muss %% lauten (keine)
t entspricht jedem Leerzeichen (keine)
n entspricht jedem Leerzeichen (keine)
Jahr
Y analysiert das vollständige Jahr als 4-stellige Dezimalzahl, führende Nullen erlaubt aber nicht erforderlich tm_year
EY analysiert Jahr in der alternativen Darstellung, z.B. 平成23年 (Jahr Heisei 23), was 2011 in tm_year im ja_JP-Locale schreibt tm_year
y analysiert die letzten 2 Ziffern des Jahres als Dezimalzahl. Bereich [69,99] ergibt Werte 1969 bis 1999, Bereich [00,68] ergibt 2000-2068 tm_year
Oy analysiert die letzten 2 Ziffern des Jahres unter Verwendung des alternativen Zahlensystems, z.B. wird 十一 als 11 im ja_JP-Locale analysiert tm_year
Ey analysiert year als Offset vom alternativen Kalenderzeitraum des Gebietsschemas %EC tm_year
C analysiert die ersten 2 Ziffern von year als Dezimalzahl (Bereich [00,99] ) tm_year
EC analysiert den Namen des Basisjahres (Zeitraums) in der alternativen Darstellung des Gebietsschemas, z.B. 平成 (Heisei-Ära) in ja_JP tm_year
Monat
b analysiert den Monatsnamen, entweder vollständig oder abgekürzt, z.B. Oct tm_mon
h Synonym von b tm_mon
B Synonym von b tm_mon
m analysiert den Monat als Dezimalzahl (Bereich [01,12] ), führende Nullen erlaubt, aber nicht erforderlich tm_mon
Om analysiert den Monat unter Verwendung des alternativen Zahlensystems, z.B. wird 十二 als 12 im ja_JP-Locale analysiert tm_mon
Woche
U analysiert die Kalenderwoche des Jahres als Dezimalzahl (Sonntag ist der erste Tag der Woche) (Bereich [00,53] ), führende Nullen erlaubt, aber nicht erforderlich tm_year , tm_wday , tm_yday
OU analysiert die Kalenderwoche des Jahres , wie durch %U , unter Verwendung des alternativen Zahlensystems, z.B. wird 五十二 als 52 im ja_JP-Locale analysiert tm_year , tm_wday , tm_yday
W analysiert die Kalenderwoche des Jahres als Dezimalzahl (Montag ist der erste Tag der Woche) (Bereich [00,53] ), führende Nullen erlaubt, aber nicht erforderlich tm_year , tm_wday , tm_yday
OW analysiert die Kalenderwoche des Jahres , wie durch %W , unter Verwendung des alternativen Zahlensystems, z.B. wird 五十二 als 52 im ja_JP-Locale analysiert tm_year , tm_wday , tm_yday
Tag des Jahres/Monats
j analysiert den Tag des Jahres als Dezimalzahl (Bereich [001,366] ), führende Nullen erlaubt, aber nicht erforderlich tm_yday
d analysiert den Tag des Monats als Dezimalzahl (Bereich [01,31] ), führende Nullen erlaubt, aber nicht erforderlich tm_mday
Od analysiert den Tag des Monats unter Verwendung des alternativen Zahlensystems, z.B. wird 二十七 im ja_JP-Locale als 27 analysiert, führende Nullen erlaubt aber nicht erforderlich tm_mday
e Synonym für d tm_mday
Oe Synonym von Od tm_mday
Wochentag
a analysiert den Namen des Wochentags, entweder vollständig oder abgekürzt, z.B. Fri tm_wday
A Synonym von a tm_wday
w analysiert weekday als Dezimalzahl, wobei Sonntag 0 ist (Bereich [0-6] ) tm_wday
Ow analysiert weekday als Dezimalzahl, wobei Sonntag 0 ist, unter Verwendung des alternativen Zahlensystems, z.B. wird 二 in ja_JP-Lokalisierung als 2 analysiert tm_wday
Stunde, Minute, Sekunde
H analysiert die Stunde als Dezimalzahl, 24-Stunden-Format (Bereich [00-23] ), führende Nullen erlaubt aber nicht erforderlich tm_hour
OH analysiert Stunde aus dem 24-Stunden-Format unter Verwendung des alternativen Zahlensystems, z.B. wird 十八 in ja_JP-Lokalisierung als 18 analysiert tm_hour
I analysiert hour als Dezimalzahl, 12-Stunden-Zählung (Bereich [01,12] ), führende Nullen erlaubt aber nicht erforderlich tm_hour
OI analysiert Stunde aus dem 12-Stunden-Format unter Verwendung des alternativen Zahlensystems, z.B. wird 六 im ja_JP-Locale als 06 gelesen tm_hour
M analysiert minute als Dezimalzahl (Bereich [00,59] ), führende Nullen erlaubt, aber nicht erforderlich tm_min
OM analysiert minute unter Verwendung des alternativen Zahlensystems, z.B. wird 二十五 als 25 in ja_JP-Locale analysiert tm_min
S analysiert second als Dezimalzahl (Bereich [00,60] ), führende Nullen erlaubt aber nicht erforderlich tm_sec
OS analysiert second unter Verwendung des alternativen Zahlensystems, z.B. wird 二十四 als 24 in der ja_JP-Lokalisierung analysiert tm_sec
Sonstiges
c analysiert das Standard-Datums- und Zeitformat der Locale, z.B. Sun Oct 17 04:41:13 2010 (lokaleabhängig) alle
Ec analysiert das alternative Datums- und Zeitformat der Locale, z.B. erwartet 平成23年 (Jahr Heisei 23) statt 2011年 (Jahr 2011) in der ja_JP-Locale alle
x analysiert die Standarddatumsdarstellung des Gebietsschemas alle
Ex analysiert die alternative Datumsdarstellung des Gebietsschemas, z.B. erwartet 平成23年 (Jahr Heisei 23) statt 2011年 (Jahr 2011) im ja_JP-Gebietsschema alle
X analysiert die Standardzeitdarstellung des Gebietsschemas alle
EX analysiert die alternative Zeitdarstellung des Gebietsschemas alle
D entspricht "%m / %d / %y " tm_mon , tm_mday , tm_year
r analysiert die lokale Standard-12-Stunden-Zeit (in POSIX, "%I : %M : %S %p" ) tm_hour , tm_min , tm_sec
R entspricht "%H : %M" tm_hour , tm_min
T entspricht "%H : %M : %S" tm_hour , tm_min , tm_sec
p analysiert das lokale Äquivalent von a.m. or p.m. tm_hour

Hinweis: tm_isdst wird nicht beschrieben und muss explizit gesetzt werden für die Verwendung mit Funktionen wie mktime

Rückgabewert

Iterator, der auf eine Position nach dem letzten erfolgreich geparsten Zeichen in [ beg, end ) zeigt.

Hinweise

Der Groß-/Kleinschreibung-ignorierende Vergleich für die Nicht-Leerzeichen-, Nicht- '%' -Zeichen in der Formatzeichenfolge verwendet typischerweise, aber nicht zwingend, die std::collate -Facette der durch str bereitgestellten Locale.

Wenn ein Parsing-Fehler auftritt, lassen viele Implementierungen dieser Funktion * t vollständig unverändert.

Es ist nicht spezifiziert, ob diese Funktionen die Felder in * t auf Null setzen, die sie nicht direkt setzen: portable Programme sollten jedes Feld vor dem Aufruf von get() auf Null initialisieren.

Beispiel

#include <iomanip>
#include <iostream>
#include <locale>
#include <sstream>
int main()
{
    std::istringstream ss("2026-März-12 23:45:56");
    ss.imbue(std::locale("de_DE.utf8"));
    auto& f = std::use_facet<std::time_get<char>>(ss.getloc());
    std::tm t{};
    std::string s = "%Y-%b-%d %H:%M:%S";
    std::ios_base::iostate err = std::ios_base::goodbit;
    auto ret = f.get({ss}, {}, ss, err, &t, &s[0], &s[0] + s.size());
    ss.setstate(err);
    std::istreambuf_iterator<char> last{};
    if (ss)
    {
        std::cout << "Erfolgreich geparst als " << std::put_time(&t, "%c") << '\n';
        if (ret != last)
        {
            std::cout << "Verbleibender Inhalt: ";
            std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
        }
        else
            std::cout << "Die Eingabe wurde vollständig verarbeitet.";
    }
    else
    {
        std::cout << "Parsen fehlgeschlagen.\nUngeparster String: ";
        std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
    }
    std::cout << '\n';
}

Ausgabe:

Successfully parsed as Sun Mar 12 23:45:56 2026
The input was fully consumed.

Siehe auch

(C++11)
analysiert einen Datums-/Zeitwert in angegebenem Format
(Funktionsschablone)