es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , ,

Answer

  1. Avatar for 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.

Comments are closed.