Error de análisis de get_time para el año de dos dígitos.
std::get_time se comporta de la misma manera cuando el formato incluye ‘%y’ o ‘%Y’, en ambos casos intenta leer un año de cuatro dígitos. ¿Estoy haciendo algo mal o es un error?
Código de ejemplo:
#include <iostream>
#include <iomanip>
void testDate(const char *format, const char *date)
{
std::istringstream ds(date);
std::tm tm = {};
ds >> std::get_time(&tm, format);
std::cout << date << " parsed using " << format << " -> Año: " << tm.tm_year + 1900 << " Mes: " << tm.tm_mon << " Día: " << tm.tm_mday << std::endl;
}
int main()
{
testDate("%y%m%d", "101112");
testDate("%Y%m%d", "101112");
testDate("%y%m%d", "20101112");
testDate("%Y%m%d", "20101112");
return 0;
}
Salida:
101112 parsed using %y%m%d -> Año: 1011 Mes: 11 Día: 12
101112 parsed using %Y%m%d -> Año: 1011 Mes: 11 Día: 12
20101112 parsed using %y%m%d -> Año: 2010 Mes: 10 Día: 12
20101112 parsed using %Y%m%d -> Año: 2010 Mes: 10 Día: 12
Probado con:
g++ (SUSE Linux) 11.2.1 20210816 [revisión 056e324ce46a7924b5cf10f61010cf9dd2ca10e9]
clang++ versión 12.0.1
davy.ai
No es un error en std::get_time. Según el estándar de C++, %y espera un año de dos dígitos y %Y espera un año de cuatro dígitos. En tu código de ejemplo, estás pasando un año de cuatro dígitos al formato %y%m%d, lo cual causa un comportamiento inesperado. De manera similar, pasar un año de dos dígitos al formato %Y%m%d también resultará en un comportamiento inesperado. Por lo tanto, es importante utilizar el especificador de formato correcto según el formato de fecha de entrada.