Namespaces
Variants

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

From cppreference.net
Défini dans l'en-tête <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) (depuis 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) (depuis C++11)
1) Analyse la date et l'heure à partir de la séquence de caractères d'entrée [ beg, end ) selon le format fourni dans la séquence de caractères [ fmtbeg, fmtend ) . Le format est censé suivre la description ci-dessous, bien que le traitement réel de chaque spécificateur de format puisse être personnalisé en redéfinissant do_get . La fonction get effectue les opérations suivantes : Premièrement, efface les bits d'erreur dans err en exécutant err = std:: ios_base :: goodbit . Puis entre dans une boucle, qui se termine dès que l'une des conditions suivantes devient vraie (vérifiée dans cet ordre) :
a) Tous les caractères ont été lus depuis la chaîne de format ( fmtbeg == fmtend ).
b) Une erreur d'analyse s'est produite ( err ! = std:: ios_base :: goodbit ).
c) Tous les caractères ont été lus depuis la séquence d'entrée ( beg == end ). Si cette condition termine la boucle, la fonction positionne à la fois eofbit et failbit dans err .
Dans le corps de la boucle, les étapes suivantes se produisent :
a) Si le caractère suivant dans la chaîne de format est '%' , suivi d'un ou deux caractères formant un spécificateur de conversion valide pour std::get_time (voir ci-dessous), ces caractères sont utilisés dans l'appel do_get ( beg, end, str, err, t, format, modifier ) , où format est le caractère principal du spécificateur de conversion, et modifier est le modificateur optionnel (qui apparaît entre % et le caractère de format, s'il est présent). S'il n'y a pas de modificateur, la valeur ' \0 ' est utilisée. Si la chaîne de format est ambiguë ou se termine trop tôt pour déterminer le spécificateur de conversion après '%' , eofbit est positionné dans err et la boucle est terminée. Si, après l'appel à do_get , aucun bit d'erreur n'est positionné dans err , la fonction incrémente fmtbeg pour pointer juste après le spécificateur de conversion et poursuit la boucle.
b) Si le caractère suivant est un espace blanc, comme indiqué par les paramètres régionaux fournis dans le flux str (c'est-à-dire std:: isspace ( * fmtbeg, str. getloc ( ) ) == true ), la fonction continue d'incrémenter fmtbeg jusqu'à ce qu'il devienne égal à fmtend ou qu'il pointe vers un caractère non-espace blanc.
c) Si le caractère suivant dans la chaîne de format est équivalent au caractère suivant dans le flux d'entrée selon une comparaison insensible à la casse, la fonction avance les deux séquences d'un caractère ++ fmtbeg, ++ beg ; et continue la boucle. Sinon, elle définit le failbit dans err .
2) Analyse une spécification de conversion de la séquence d'entrée [ beg, end ) et met à jour la structure std::tm pointée par t en conséquence.
Premièrement, efface les bits d'erreur dans err en exécutant err = std:: ios_base :: goodbit . Ensuite, lit les caractères de la séquence d'entrée [ beg, end ) qui sont attendus par le spécificateur de format std::time_get formé en combinant '%' , modifier (si différent de ' \0 ' ), et format . Si les caractères ne forment pas un spécificateur de conversion valide, positionne failbit dans err . Si la fin du flux d'entrée est atteinte après lecture d'un caractère, positionne eofbit dans err . Si la chaîne d'entrée a été analysée avec succès, met à jour les champs correspondants de * t .
Pour les spécificateurs de conversion complexes, tels que '%x' ou '%c' , ou les directives qui utilisent les modificateurs 'E' et 'O' , la fonction peut échouer à déterminer certaines des valeurs à stocker dans * t . Dans ce cas, elle positionne eofbit dans err et laisse ces champs dans un état non spécifié.

Table des matières

Paramètres

beg - itérateur désignant le début de la séquence à analyser
end - itérateur indiquant la fin de la séquence à analyser (position après le dernier élément)
str - un objet de flux utilisé par cette fonction pour obtenir les facettes de locale lorsque nécessaire, par exemple std::ctype pour ignorer les espaces blancs ou std::collate pour comparer des chaînes
err - objet d'indicateurs d'erreur de flux modifié par cette fonction pour signaler les erreurs
t - pointeur vers l'objet std::tm qui contiendra le résultat de cet appel de fonction
fmtbeg - pointeur vers le premier caractère d'une séquence de caractères char_type spécifiant le format de conversion (voir ci-dessous)
fmtend - pointeur indiquant la fin d'une séquence de caractères char_type spécifiant le format de conversion (position après le dernier caractère)
format - le caractère qui nomme un spécificateur de conversion
modifier - le modificateur optionnel qui peut apparaître entre % et le spécificateur de conversion


La chaîne de format consiste en zéro ou plusieurs spécificateurs de conversion, des caractères d'espacement et des caractères ordinaires (à l'exception de % ). Chaque caractère ordinaire doit correspondre à un caractère dans le flux d'entrée lors d'une comparaison insensible à la casse. Chaque caractère d'espacement correspond à un espacement arbitraire dans la chaîne d'entrée. Chaque spécification de conversion commence par le caractère % , suivi optionnellement du modificateur E ou O (ignoré si non supporté par les paramètres régionaux), puis du caractère qui détermine le comportement du spécificateur. Les spécificateurs de format correspondent à la fonction POSIX strptime() :

Spécificateur
de conversion
Explication Écrit dans les champs
% correspond à un caractère % littéral. La spécification de conversion complète doit être %% (aucun)
t correspond à tout caractère d'espacement (aucun)
n correspond à tout espace blanc (aucun)
Année
Y analyse l'année complète year comme un nombre décimal à 4 chiffres, les zéros non significatifs sont autorisés mais non requis tm_year
EY analyse year dans la représentation alternative, par exemple 平成23年 (année Heisei 23) qui écrit 2011 dans tm_year pour la locale ja_JP tm_year
y analyse les 2 derniers chiffres de l' année comme un nombre décimal. La plage [69,99] donne les valeurs 1969 à 1999, la plage [00,68] donne 2000-2068 tm_year
Oy analyse les 2 derniers chiffres de l' année en utilisant le système numérique alternatif, par exemple 十一 est analysé comme 11 dans la locale ja_JP tm_year
Ey analyse l' année comme décalage depuis la période du calendrier alternatif de la locale %EC tm_year
C analyse les 2 premiers chiffres de year comme un nombre décimal (plage [00,99] ) tm_year
EC analyse le nom de l'année de base (période) dans la représentation alternative de la locale, par exemple 平成 (ère Heisei) en ja_JP tm_year
Mois
b analyse le nom du mois, complet ou abrégé, par ex. Oct tm_mon
h synonyme de b tm_mon
B synonyme de b tm_mon
m analyse le mois sous forme de nombre décimal (plage [01,12] ), les zéros initiaux autorisés mais non requis tm_mon
Om analyse le mois en utilisant le système numérique alternatif, par exemple 十二 est analysé comme 12 dans la locale ja_JP tm_mon
Semaine
U analyse la semaine de l'année comme un nombre décimal (le dimanche est le premier jour de la semaine) (plage [00,53] ), les zéros initiaux autorisés mais non requis tm_year , tm_wday , tm_yday
OU analyse la semaine de l'année , comme avec %U , en utilisant le système numérique alternatif, par exemple 五十二 est analysé comme 52 dans la locale ja_JP tm_year , tm_wday , tm_yday
W analyse la semaine de l'année comme un nombre décimal (le lundi est le premier jour de la semaine) (plage [00,53] ), les zéros initiaux autorisés mais non requis tm_year , tm_wday , tm_yday
OW analyse la semaine de l'année , comme avec %W , en utilisant le système numérique alternatif, par exemple 五十二 est analysé comme 52 dans les paramètres régionaux ja_JP tm_year , tm_wday , tm_yday
Jour de l'année/mois
j analyse le jour de l'année comme un nombre décimal (plage [001,366] ), les zéros initiaux sont autorisés mais non requis tm_yday
d analyse le jour du mois sous forme de nombre décimal (plage [01,31] ), les zéros initiaux sont autorisés mais non requis tm_mday
Od analyse le jour du mois en utilisant le système numérique alternatif, par exemple 二十七 est analysé comme 27 dans la locale ja_JP, les zéros non significatifs sont autorisés mais non requis tm_mday
e synonyme de d tm_mday
Oe synonyme de Od tm_mday
Jour de la semaine
a analyse le nom du jour de la semaine, complet ou abrégé, par exemple Fri tm_wday
A synonyme de a tm_wday
w analyse weekday comme un nombre décimal, où dimanche est 0 (plage [0-6] ) tm_wday
Ow analyse weekday comme un nombre décimal, où dimanche est 0 , en utilisant le système numérique alternatif, par exemple 二 est analysé comme 2 dans la locale ja_JP tm_wday
Heure, minute, seconde
H analyse l' heure comme un nombre décimal, horloge 24 heures (plage [00-23] ), les zéros initiaux autorisés mais non requis tm_hour
OH analyse l' heure à partir de l'horloge 24 heures en utilisant le système numérique alternatif, par exemple 十八 est analysé comme 18 dans la locale ja_JP tm_hour
I analyse hour comme un nombre décimal, horloge 12 heures (plage [01,12] ), les zéros initiaux autorisés mais non requis tm_hour
OI analyse hour à partir de l'horloge 12 heures en utilisant le système numérique alternatif, par exemple 六 se lit comme 06 dans la locale ja_JP tm_hour
M analyse minute comme un nombre décimal (plage [00,59] ), les zéros non significatifs autorisés mais non requis tm_min
OM analyse minute en utilisant le système numérique alternatif, par exemple 二十五 est analysé comme 25 dans la locale ja_JP tm_min
S analyse second comme un nombre décimal (plage [00,60] ), les zéros initiaux autorisés mais non requis tm_sec
OS analyse second en utilisant le système numérique alternatif, par exemple 二十四 est analysé comme 24 dans la locale ja_JP tm_sec
Autre
c analyse la chaîne de format standard de date et heure de la locale, par exemple Sun Oct 17 04:41:13 2010 (dépendant de la locale) tout
Ec analyse le format alternatif de chaîne de date et d'heure de la locale, par exemple en s'attendant à 平成23年 (année Heisei 23) au lieu de 2011年 (année 2011) dans la locale ja_JP tout
x analyse la représentation standard de la date selon les paramètres régionaux tous
Ex analyse la représentation de date alternative de la locale, par exemple en s'attendant à 平成23年 (année Heisei 23) au lieu de 2011年 (année 2011) dans la locale ja_JP tout
X analyse la représentation horaire standard de la locale tout
EX analyse la représentation temporelle alternative de la locale tous
D équivalent à "%m / %d / %y " tm_mon , tm_mday , tm_year
r analyse l'heure standard sur 12 heures de la locale (en POSIX, "%I : %M : %S %p" ) tm_hour , tm_min , tm_sec
R équivalent à "%H : %M" tm_hour , tm_min
T équivalent à "%H : %M : %S" tm_hour , tm_min , tm_sec
p analyse l'équivalent local de a.m. ou p.m. tm_hour

Note : tm_isdst n'est pas écrit et doit être défini explicitement pour être utilisé avec des fonctions telles que mktime

Valeur de retour

Itérateur pointant un caractère au-delà du dernier caractère dans [ beg, end ) qui a été analysé avec succès.

Notes

La comparaison insensible à la casse pour les caractères non-blancs et non- '%' dans la chaîne de format, le facet std::collate de la locale fournie par str est généralement, mais pas nécessairement, utilisé.

Si une erreur d'analyse syntaxique est rencontrée, de nombreuses implémentations de cette fonction laissent * t complètement inchangé.

Il n'est pas spécifié si ces fonctions mettent à zéro les champs dans * t qu'elles ne définissent pas directement : les programmes portables doivent initialiser chaque champ à zéro avant d'appeler get() .

Exemple

#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 << "Successfully parsed as " << std::put_time(&t, "%c") << '\n';
        if (ret != last)
        {
            std::cout << "Remaining content: ";
            std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
        }
        else
            std::cout << "The input was fully consumed.";
    }
    else
    {
        std::cout << "Parse failed.\nUnparsed string: ";
        std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
    }
    std::cout << '\n';
}

Sortie :

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

Voir aussi

(C++11)
analyse une valeur de date/heure au format spécifié
(modèle de fonction)