Namespaces
Variants

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

From cppreference.net
Definido en el encabezado <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) (desde 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) (desde C++11)
1) Analiza la fecha y hora de la secuencia de caracteres de entrada [ beg, end ) de acuerdo con el formato proporcionado en la secuencia de caracteres [ fmtbeg, fmtend ) . Se espera que el formato siga la descripción proporcionada más abajo, aunque el procesamiento real de cada especificador de formato puede personalizarse sobrescribiendo do_get . La función get realiza lo siguiente: Primero, limpia los bits de error en err ejecutando err = std:: ios_base :: goodbit . Luego entra en un bucle, que termina cuando cualquiera de las siguientes condiciones se vuelve verdadera (verificadas en este orden):
a) Se han leído todos los caracteres de la cadena de formato ( fmtbeg == fmtend ).
b) Hubo un error de análisis ( err ! = std:: ios_base :: goodbit ).
c) Todos los caracteres han sido leídos de la secuencia de entrada ( beg == end ). Si esta condición termina el bucle, la función establece tanto eofbit como failbit en err .
En el cuerpo del bucle, se llevan a cabo los siguientes pasos:
a) Si el siguiente carácter en la cadena de formato es '%' , seguido por uno o dos caracteres que formen un especificador de conversión válido para std::get_time (ver más abajo), estos caracteres se utilizan en la llamada do_get ( beg, end, str, err, t, format, modifier ) , donde format es el carácter del especificador de conversión principal, y modifier es el modificador opcional (que aparece entre % y el carácter de formato, si está presente). Si no hay modificador, se utiliza el valor ' \0 ' . Si la cadena de formato es ambigua o termina demasiado pronto para determinar el especificador de conversión después de '%' , eofbit se establece en err y el bucle termina. Si, después de la llamada a do_get , no se establecen bits de error en err , la función incrementa fmtbeg para que apunte justo después del especificador de conversión y continúa el bucle.
b) Si el siguiente carácter es un espacio en blanco, como lo indica la configuración regional proporcionada en el flujo str (es decir, std:: isspace ( * fmtbeg, str. getloc ( ) ) == true ), la función continúa incrementando fmtbeg hasta que se vuelve igual a fmtend o apunta a un carácter que no es un espacio en blanco.
c) Si el siguiente carácter en la cadena de formato es equivalente al siguiente carácter en el flujo de entrada según una comparación que no distingue entre mayúsculas y minúsculas, la función avanza ambas secuencias en un carácter ++ fmtbeg, ++ beg ; y continúa el bucle. De lo contrario, establece el failbit en err .
2) Analiza un especificador de conversión de la secuencia de entrada [ beg, end ) y actualiza la estructura std::tm apuntada por t en consecuencia.
Primero, limpia los bits de error en err ejecutando err = std:: ios_base :: goodbit . Luego lee caracteres de la secuencia de entrada [ beg, end ) que son esperados por el especificador de formato std::time_get formado al combinar '%' , modifier (si no es ' \0 ' ), y format . Si los caracteres no se combinan para formar un especificador de conversión válido, establece failbit en err . Si se alcanza el final del flujo de entrada después de leer un carácter, establece eofbit en err . Si la cadena de entrada fue analizada exitosamente, actualiza los campos correspondientes de * t .
Para especificadores de conversión complejos, como '%x' o '%c' , o las directivas que utilizan los modificadores 'E' y 'O' , la función puede fallar al determinar algunos de los valores a almacenar en * t . En tal caso, establece eofbit en err y deja estos campos en estado no especificado.

Contenidos

Parámetros

beg - iterador que designa el inicio de la secuencia a analizar
end - iterador que apunta una posición después del final de la secuencia a analizar
str - objeto de flujo que esta función utiliza para obtener facetas de configuración regional cuando es necesario, ej. std::ctype para omitir espacios en blanco o std::collate para comparar cadenas
err - objeto de indicadores de error de flujo que es modificado por esta función para indicar errores
t - puntero al objeto std::tm que contendrá el resultado de esta llamada de función
fmtbeg - puntero al primer carácter de una secuencia de caracteres char_type que especifica el formato de conversión (ver abajo)
fmtend - puntero una posición después del último carácter de una secuencia de caracteres char_type que especifica el formato de conversión
format - el carácter que nombra un especificador de conversión
modifier - el modificador opcional que puede aparecer entre % y el especificador de conversión


La cadena de formato consiste en cero o más especificadores de conversión, caracteres de espacio en blanco y caracteres ordinarios (excepto % ). Se espera que cada carácter ordinario coincida con un carácter en el flujo de entrada en comparación sin distinción entre mayúsculas y minúsculas. Cada carácter de espacio en blanco coincide con espacios en blanco arbitrarios en la cadena de entrada. Cada especificación de conversión comienza con el carácter % , opcionalmente seguido por el modificador E o O (ignorado si no es compatible con la configuración regional), seguido del carácter que determina el comportamiento del especificador. Los especificadores de formato coinciden con la función POSIX strptime() :

Especificador
de conversión
Explicación Escribe en campos
% coincide con un literal % . La especificación de conversión completa debe ser %% (ninguno)
t coincide con cualquier espacio en blanco (ninguno)
n coincide con cualquier espacio en blanco (ninguno)
Año
Y analiza el año completo como un número decimal de 4 dígitos, se permiten ceros a la izquierda pero no son obligatorios tm_year
EY analiza el año en la representación alternativa, p.ej. 平成23年 (año Heisei 23) que escribe 2011 en tm_year en la configuración regional ja_JP tm_year
y analiza los últimos 2 dígitos del año como número decimal. El rango [69,99] produce valores de 1969 a 1999, el rango [00,68] produce 2000-2068 tm_year
Oy analiza los últimos 2 dígitos del año usando el sistema numérico alternativo, por ejemplo 十一 se analiza como 11 en la configuración regional ja_JP tm_year
Ey analiza el año como desplazamiento desde el período del calendario alternativo de la configuración regional %EC tm_year
C analiza los primeros 2 dígitos del año como un número decimal (rango [00,99] ) tm_year
EC analiza el nombre del año base (período) en la representación alternativa de la configuración regional, por ejemplo 平成 (era Heisei) en ja_JP tm_year
Mes
b analiza el nombre del mes, completo o abreviado, por ejemplo Oct tm_mon
h sinónimo de b tm_mon
B sinónimo de b tm_mon
m analiza el mes como un número decimal (rango [01,12] ), se permiten ceros iniciales pero no son obligatorios tm_mon
Om analiza el mes utilizando el sistema numérico alternativo, ej. 十二 se analiza como 12 en la configuración regional ja_JP tm_mon
Semana
U analiza la semana del año como un número decimal (el domingo es el primer día de la semana) (rango [00,53] ), se permiten ceros iniciales pero no son obligatorios tm_year , tm_wday , tm_yday
OU analiza la semana del año , como lo hace %U , utilizando el sistema numérico alternativo, p.ej. 五十二 se analiza como 52 en la configuración regional ja_JP tm_year , tm_wday , tm_yday
W analiza la semana del año como un número decimal (el lunes es el primer día de la semana) (rango [00,53] ), se permiten ceros iniciales pero no son obligatorios tm_year , tm_wday , tm_yday
OW analiza la semana del año , como lo hace %W , utilizando el sistema numérico alternativo, p.ej. 五十二 se analiza como 52 en la configuración regional ja_JP tm_year , tm_wday , tm_yday
Día del año/mes
j analiza el día del año como un número decimal (rango [001,366] ), se permiten ceros a la izquierda pero no son obligatorios tm_yday
d analiza el día del mes como un número decimal (rango [01,31] ), se permiten ceros iniciales pero no son obligatorios tm_mday
Od analiza el día del mes utilizando el sistema numérico alternativo, p.ej. 二十七 se analiza como 27 en la configuración regional ja_JP, se permiten ceros iniciales pero no son obligatorios tm_mday
e sinónimo de d tm_mday
Oe sinónimo de Od tm_mday
Día de la semana
a analiza el nombre del día de la semana, completo o abreviado, por ejemplo Fri tm_wday
A sinónimo de a tm_wday
w analiza el día de la semana como un número decimal, donde el domingo es 0 (rango [0-6] ) tm_wday
Ow analiza el día de la semana como un número decimal, donde el domingo es 0 , utilizando el sistema numérico alternativo, por ejemplo, 二 se analiza como 2 en la configuración regional ja_JP tm_wday
Hora, minuto, segundo
H analiza la hora como un número decimal, reloj de 24 horas (rango [00-23] ), se permiten ceros a la izquierda pero no son obligatorios tm_hour
OH analiza la hora del reloj de 24 horas utilizando el sistema numérico alternativo, por ejemplo 十八 se analiza como 18 en la configuración regional ja_JP tm_hour
I analiza hour como un número decimal, reloj de 12 horas (rango [01,12] ), se permiten ceros a la izquierda pero no son obligatorios tm_hour
OI analiza la hora del reloj de 12 horas utilizando el sistema numérico alternativo, por ejemplo 六 se lee como 06 en la configuración regional ja_JP tm_hour
M analiza el minuto como un número decimal (rango [00,59] ), se permiten ceros a la izquierda pero no son obligatorios tm_min
OM analiza el minuto utilizando el sistema numérico alternativo, por ejemplo 二十五 se analiza como 25 en la configuración regional ja_JP tm_min
S analiza el segundo como un número decimal (rango [00,60] ), se permiten ceros iniciales pero no son obligatorios tm_sec
OS analiza el segundo utilizando el sistema numérico alternativo, por ejemplo, 二十四 se analiza como 24 en la configuración regional ja_JP tm_sec
Otros
c analiza el formato estándar de cadena de fecha y hora de la configuración regional, por ejemplo Sun Oct 17 04:41:13 2010 (dependiente de la configuración regional) todos
Ec analiza el formato alternativo de cadena de fecha y hora de la configuración regional, por ejemplo, esperando 平成23年 (año Heisei 23) en lugar de 2011年 (año 2011) en la configuración regional ja_JP todos
x analiza la representación estándar de fecha de la configuración regional todos
Ex analiza la representación de fecha alternativa de la configuración regional, por ejemplo, esperando 平成23年 (año Heisei 23) en lugar de 2011年 (año 2011) en la configuración regional ja_JP todos
X analiza la representación estándar de hora de la configuración regional todos
EX analiza la representación alternativa de tiempo de la configuración regional todos
D equivalente a "%m / %d / %y " tm_mon , tm_mday , tm_year
r analiza la hora estándar de 12 horas de la configuración regional (en POSIX, "%I : %M : %S %p" ) tm_hour , tm_min , tm_sec
R equivalente a "%H : %M" tm_hour , tm_min
T equivalente a "%H : %M : %S" tm_hour , tm_min , tm_sec
p analiza el equivalente local de a.m. o p.m. tm_hour

Nota: tm_isdst no se escribe, y debe establecerse explícitamente para su uso con funciones como mktime

Valor de retorno

Iterador que apunta una posición después del último carácter en [ beg, end ) que fue analizado exitosamente.

Notas

La comparación que no distingue entre mayúsculas y minúsculas para los caracteres que no son espacios en blanco ni '%' en la cadena de formato, normalmente, pero no necesariamente, se utiliza el facet std::collate de la configuración regional proporcionada por str .

Si se encuentra un error de análisis, muchas implementaciones de esta función dejan * t completamente intacto.

No está especificado si estas funciones ponen a cero los campos en * t que no establecen directamente: los programas portables deben inicializar cada campo a cero antes de llamar a get() .

Ejemplo

#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';
}

Salida:

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

Véase también

(C++11)
analiza un valor de fecha/hora con formato especificado
(plantilla de función)