Namensräume
Varianten
Aktionen

std::time_put<CharT,OutputIt>::put, std::time_put<CharT,OutputIt>::do_put

Von cppreference.com
< cpp‎ | locale‎ | time put
 
 
 
 
std::time_put
Memberfunktionen
time_put::puttime_put::do_put
 
Definiert in Header <locale>
public:

iter_type put( iter_type out, std::ios_base& str,
               char_type fill, const std::tm* t,

               const CharT* fmtbeg, const CharT* fmtend ) const;
(1)
public:

iter_type put( iter_type out, std::ios_base& str,
               char_type fill, const std::tm* t,

               char format, char modifier = 0 ) const;
(2)
protected:

virtual iter_type do_put( iter_type out, std::ios_base& str,
                          char_type fill, const std::tm* t,

                          char format, char modifier ) const;
(3)

Konvertiert das Datum und die Uhrzeit, die im von t zeigenden std::tm Objekt gespeichert sind, gemäß der Formatierungszeichenkette [fmtbeg, fmtend) in eine Zeichenkette. Die Formatierungszeichenkette ist die gleiche wie die von std::strftime verwendete, aber jeder Format-Spezifizierer wird durch einen einzelnen Aufruf von do_put() verarbeitet, was durch Erweiterung dieser Facette angepasst werden kann.

1) Durchläuft die Zeichensequenz [fmtbeg, fmtend) und untersucht die Zeichen. Jedes Zeichen, das kein Teil einer Formatsequenz ist, wird sofort auf den Ausgabeliterator out geschrieben. Um Formatsequenzen zu identifizieren, schmalert diese Funktion das nächste Zeichen c in [fmtbeg, fmtend), als ob durch std::ctype<char_type>(str.getloc()).narrow(c, 0) und wenn es gleich '%' ist, werden die nächsten ein oder zwei Zeichen mit der Liste der von std::strftime erkannten Formatsequenzen sowie allen zusätzlichen implementierungsdefinierten Formaten, die von dieser Locale unterstützt werden, verglichen. Für jede gültige Formatsequenz wird ein Aufruf von do_put(out, str, fill, t, format, modifier) gemacht, wobei format das Formatsequenzzeichen und modifier der optionale Formatsequenzmodifikator ('E' oder 'O') ist. Ein Wert von '\0' wird verwendet, wenn der Modifikator fehlt.
2) Ruft die do_put-Memberfunktion der am weitesten abgeleiteten Klasse auf.
3) Konvertiert das Datum und die Uhrzeit, die im von t zeigenden std::tm Objekt gespeichert sind, gemäß der Formatkonvertierungssequenz, die durch Konkatenation von '%', dem Wert von modifier (falls nicht '\0') und dem Wert von format gebildet wird, in eine Zeichenkette. Das Format wird auf die gleiche Weise interpretiert wie die Funktion std::strftime, außer dass die als locale-abhängig beschriebenen Formate durch diese Locale definiert sind und zusätzliche Format-Spezifizierer unterstützt werden können (das Argument fill steht für diese implementierungsdefinierten Format-Spezifizierer zur Verfügung). Die Zeichenkette wird auf den Ausgabeliterator out geschrieben.

Inhalt

[bearbeiten] Parameter

out - Ausgabeliterator, auf den das Ergebnis der Konvertierung geschrieben wird
str - Ein Stream-Objekt, von dem diese Funktion bei Bedarf Locale-Facetten bezieht, z.B. std::ctype zum Schmalern von Zeichen
t - Zeiger auf das std::tm-Objekt, aus dem die Datums-/Zeitwerte bezogen werden
fmtbeg - Zeiger auf das erste Zeichen einer Sequenz von char_type-Zeichen, das das Konvertierungsformat spezifiziert
fmtend - Zeiger auf das Zeichen nach dem letzten Zeichen einer Sequenz von char_type-Zeichen, das das Konvertierungsformat spezifiziert
fill - Füllzeichen (normalerweise Leerzeichen)
format - Das Zeichen, das einen Konvertierungsspezifizierer benennt
modifier - Der optionale Modifikator, der zwischen % und dem Konvertierungsspezifizierer stehen kann

[bearbeiten] Formatstring

Die Formatzeichenkette besteht aus null oder mehr Konversionsspezifizierern und gewöhnlichen Zeichen (außer %). Alle gewöhnlichen Zeichen, einschließlich des terminierenden Nullzeichens, werden unverändert in den Ausgabestring kopiert. Jede Konversionsspezifikation beginnt mit einem %-Zeichen, optional gefolgt von einem E- oder O-Modifikator (ignoriert, wenn von der Locale nicht unterstützt), gefolgt von dem Zeichen, das das Verhalten des Spezifizierers bestimmt. Die folgenden Format-Spezifizierer sind verfügbar

Konversion
Spezifizierer
Erklärung Verwendete Felder
% schreibt ein wörtliches %. Die vollständige Konversionsspezifikation muss %% sein.
n
(C++11)
schreibt ein Zeilenumbruchzeichen
t
(C++11)
schreibt ein horizontalen Tabulator
Jahr
Y schreibt das Jahr als Dezimalzahl, z.B. 2017 tm_year
EY
(C++11)
schreibt das Jahr in der alternativen Darstellung, z.B. 平成23年 (Jahr Heisei 23) anstelle von 2011年 (Jahr 2011) in der ja_JP-Locale tm_year
y schreibt die letzten 2 Ziffern des Jahres als Dezimalzahl (Bereich [00,99]) tm_year
Oy
(C++11)
schreibt die letzten 2 Ziffern des Jahres unter Verwendung des alternativen Zahlensystems, z.B. 十一 anstelle von 11 in der ja_JP-Locale tm_year
Ey
(C++11)
schreibt das Jahr als Offset von der alternativen Kalenderperiode der Locale %EC (Locale-abhängig) tm_year
C
(C++11)
schreibt die ersten 2 Ziffern des Jahres als Dezimalzahl (Bereich [00,99]) tm_year
EC
(C++11)
schreibt den Namen des Basisjahres (Periode) in der alternativen Darstellung der Locale, z.B. 平成 (Heisei-Ära) in ja_JP tm_year
G
(C++11)
schreibt das ISO 8601 wochenbasierte Jahr, d.h. das Jahr, das die angegebene Woche enthält.

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
tm_year, tm_wday, tm_yday
g
(C++11)
schreibt die letzten 2 Ziffern des ISO 8601 wochenbasierten Jahres, d.h. das Jahr, das die angegebene Woche enthält (Bereich [00,99]).

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
tm_year, tm_wday, tm_yday
Monat
b schreibt den verkürzten Monatsnamen, z.B. Okt (Locale-abhängig) tm_mon
h
(C++11)
Synonym von b tm_mon
B schreibt den vollständigen Monatsnamen, z.B. Oktober (Locale-abhängig) tm_mon
m schreibt den Monat als Dezimalzahl (Bereich [01,12]) tm_mon
Om
(C++11)
schreibt den Monat unter Verwendung des alternativen Zahlensystems, z.B. 十二 anstelle von 12 in der ja_JP-Locale tm_mon
Week
U schreibt die Woche des Jahres als Dezimalzahl (Sonntag ist der erste Tag der Woche) (Bereich [00,53]) tm_year, tm_wday, tm_yday
OU
(C++11)
schreibt die Woche des Jahres, wie bei %U, unter Verwendung des alternativen Zahlensystems, z.B. 五十二 anstelle von 52 in der ja_JP-Locale tm_year, tm_wday, tm_yday
W schreibt die Woche des Jahres als Dezimalzahl (Montag ist der erste Tag der Woche) (Bereich [00,53]) tm_year, tm_wday, tm_yday
OW
(C++11)
schreibt die Woche des Jahres, wie bei %W, unter Verwendung des alternativen Zahlensystems, z.B. 五十二 anstelle von 52 in der ja_JP-Locale tm_year, tm_wday, tm_yday
V
(C++11)
schreibt die ISO 8601 Woche des Jahres (Bereich [01,53]).

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
tm_year, tm_wday, tm_yday
OV
(C++11)
schreibt die Woche des Jahres, wie bei %V, unter Verwendung des alternativen Zahlensystems, z.B. 五十二 anstelle von 52 in der ja_JP-Locale tm_year, tm_wday, tm_yday
Tag des Jahres/Monats
j schreibt den Tag des Jahres als Dezimalzahl (Bereich [001,366]) tm_yday
d schreibt den Tag des Monats als Dezimalzahl (Bereich [01,31]) tm_mday
Od
(C++11)
schreibt den nullbasierten Tag des Monats unter Verwendung des alternativen Zahlensystems, z.B. 二十七 anstelle von 27 in der ja_JP-Locale

Ein einzelnes Zeichen wird von einem Leerzeichen gefolgt.

tm_mday
e
(C++11)
schreibt den Tag des Monats als Dezimalzahl (Bereich [1,31]).

Eine einzelne Ziffer wird von einem Leerzeichen gefolgt.

tm_mday
Oe
(C++11)
schreibt den einsbasierten Tag des Monats unter Verwendung des alternativen Zahlensystems, z.B. 二十七 anstelle von 27 in der ja_JP-Locale

Ein einzelnes Zeichen wird von einem Leerzeichen gefolgt.

tm_mday
Wochentag
a schreibt den verkürzten Wochentagsnamen, z.B. Fr (Locale-abhängig) tm_wday
A schreibt den vollständigen Wochentagsnamen, z.B. Freitag (Locale-abhängig) tm_wday
w schreibt den Wochentag als Dezimalzahl, wobei Sonntag 0 ist (Bereich [0-6]) tm_wday
Ow
(C++11)
schreibt den Wochentag, wobei Sonntag 0 ist, unter Verwendung des alternativen Zahlensystems, z.B. 二 anstelle von 2 in der ja_JP-Locale tm_wday
u
(C++11)
schreibt den Wochentag als Dezimalzahl, wobei Montag 1 ist (ISO 8601-Format) (Bereich [1-7]) tm_wday
Ou
(C++11)
schreibt den Wochentag, wobei Montag 1 ist, unter Verwendung des alternativen Zahlensystems, z.B. 二 anstelle von 2 in der ja_JP-Locale tm_wday
Stunde, Minute, Sekunde
H schreibt die Stunde als Dezimalzahl, 24-Stunden-Uhr (Bereich [00-23]) tm_hour
OH
(C++11)
schreibt die Stunde der 24-Stunden-Uhr unter Verwendung des alternativen Zahlensystems, z.B. 十八 anstelle von 18 in der ja_JP-Locale tm_hour
I schreibt die Stunde als Dezimalzahl, 12-Stunden-Uhr (Bereich [01,12]) tm_hour
OI
(C++11)
schreibt die Stunde der 12-Stunden-Uhr unter Verwendung des alternativen Zahlensystems, z.B. 六 anstelle von 06 in der ja_JP-Locale tm_hour
M schreibt die Minute als Dezimalzahl (Bereich [00,59]) tm_min
OM
(C++11)
schreibt die Minute unter Verwendung des alternativen Zahlensystems, z.B. 二十五 anstelle von 25 in der ja_JP-Locale tm_min
S schreibt die Sekunde als Dezimalzahl (Bereich [00,60]) tm_sec
OS
(C++11)
schreibt die Sekunde unter Verwendung des alternativen Zahlensystems, z.B. 二十四 anstelle von 24 in der ja_JP-Locale tm_sec
Sonstiges
c schreibt die Standard-Datums- und Zeitzeichenkette, z.B. So Okt 17 04:41:13 2010 (Locale-abhängig) all
Ec
(C++11)
schreibt die alternative Datums- und Zeitzeichenkette, z.B. unter Verwendung von 平成23年 (Jahr Heisei 23) anstelle von 2011年 (Jahr 2011) in der ja_JP-Locale all
x schreibt die lokalisierte Datumsdarstellung (Locale-abhängig) all
Ex
(C++11)
schreibt die alternative Datumsdarstellung, z.B. unter Verwendung von 平成23年 (Jahr Heisei 23) anstelle von 2011年 (Jahr 2011) in der ja_JP-Locale all
X schreibt die lokalisierte Zeitdarstellung, z.B. 18:40:20 oder 6:40:20 PM (Locale-abhängig) all
EX
(C++11)
schreibt die alternative Zeitdarstellung (Locale-abhängig) all
D
(C++11)
entspricht "%m/%d/%y" tm_mon, tm_mday, tm_year
F
(C++11)
entspricht "%Y-%m-%d" (das ISO 8601 Datumsformat) tm_mon, tm_mday, tm_year
r
(C++11)
schreibt die lokalisierte 12-Stunden-Uhrzeit (Locale-abhängig) tm_hour, tm_min, tm_sec
R
(C++11)
entspricht "%H:%M" tm_hour, tm_min
T
(C++11)
entspricht "%H:%M:%S" (das ISO 8601 Zeitformat) tm_hour, tm_min, tm_sec
p schreibt die lokalisierte vormittags- oder nachmittagsangabe (Locale-abhängig) tm_hour
z
(C++11)
schreibt den Offset von UTC im ISO 8601-Format (z.B. -0430) oder keine Zeichen, wenn die Zeitzoneninformation nicht verfügbar ist tm_isdst
Z schreibt den Locale-abhängigen Zeitzonennamen oder die Abkürzung, oder keine Zeichen, wenn die Zeitzoneninformation nicht verfügbar ist tm_isdst

[bearbeiten] Rückgabewert

Iterator, der auf das Zeichen nach dem letzten erzeugten Zeichen zeigt.

[bearbeiten] Hinweise

Es wird keine Fehlerbehandlung bereitgestellt.

Das Füllzeichen fill wird für implementierungsdefinierte Format-Spezifizierer und für benutzerdefinierte Überschreibungen von do_put() bereitgestellt, die Polsterungs- und Fülllogik verwenden. Solche Implementierungen nutzen typischerweise die Formatierungsflags von str.

[bearbeiten] Beispiel

#include <iostream>
#include <sstream>
#include <iomanip>
#include <ctime>
 
void try_time_put(const std::tm* t, const std::string& fmt)
{
    std::cout.imbue(std::locale());
    std::cout << "In the locale '" << std::cout.getloc().name() << "' : '";
 
    std::use_facet<std::time_put<char>>(std::cout.getloc()).put(
        {std::cout}, std::cout, ' ', t, &fmt[0], &fmt[0] + fmt.size());
 
    std::cout << "'\n";
}
 
int main()
{
    std::time_t t = std::time(NULL);
    std::tm tm = *std::localtime(&t);
 
    std::string fmt = "%c";
    std::cout << "Using the format string '" << fmt
              << "' to format the time: " << std::ctime(&t) << '\n';
 
    std::locale::global(std::locale("de_DE.utf8"));
    try_time_put(&tm, fmt);
 
    std::locale::global(std::locale("el_GR.utf8"));
    try_time_put(&tm, fmt);
 
    std::locale::global(std::locale("ja_JP.utf8"));
    try_time_put(&tm, fmt);
}

Mögliche Ausgabe

Using the format string '%c' to format the time: Mon Feb 11 22:58:50 2013
 
In the locale 'de_DE.utf8' : 'Mo 11 Feb 2013 23:02:38 EST'
In the locale 'el_GR.utf8' : 'Δευ 11 Φεβ 2013 11:02:38 μμ EST'
In the locale 'ja_JP.utf8' : '2013年02月11日 23時02分38秒'

[bearbeiten] Defect Reports

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 164 C++98 Der Zweck des Parameters fill war unklar wurde klargestellt

[bearbeiten] Siehe auch

(C++11)
Formatiert und gibt einen Datums-/Zeitwert gemäß dem angegebenen Format aus
(Funktion-Template) [bearbeiten]
[virtual] (C++11)
extrahiert Datum/Uhrzeit-Komponenten aus dem Eingabestream gemäß dem angegebenen Format
(virtuelle protected Memberfunktion von std::time_get<CharT,InputIt>) [bearbeiten]