C ++ boost date_input_facet parece analizar fechas inesperadamente con formatos incorrectos pasados al constructor de facetas

Código de juguete en coliru que estoy usando para probar:http://coliru.stacked-crooked.com/a/4039865d8d4dad52

Me estoy acostumbrando a C ++ nuevamente después de un largo paréntesis. Estoy escribiendo un código que analiza un CSV que puede tener varias columnas con fechas o nulos. Mi suposición es que cada columna de fecha tiene exactamente un tipo de formato de fecha válido, aunque diferentes columnas pueden tener diferentes formatos.

Para cada columna de fecha que tengo, encuentro el primer valor que se analiza con éxito como una fecha dada un std :: vector de posibles ubicaciones con un objeto boost date_input_facet. Esa primera fecha que se analiza correctamente devolverá el índice en mi conjunto de configuraciones regionales que funcionaron. Una vez que tenga el formato apropiado para la primera fecha analizable, quiero arreglar ese formato para siempre para que ya no tenga que perder el tiempo de la CPU detectando el formato.

Aquí está mi variedad de configuraciones regionales:

const std::vector<std::locale> Date::date_formats = {
    std::locale(std::locale::classic(), new date_input_facet("%Y-%m-%d")),
    std::locale(std::locale::classic(), new date_input_facet("%Y/%m/%d")),
    std::locale(std::locale::classic(), new date_input_facet("%m-%d-%Y")),
    std::locale(std::locale::classic(), new date_input_facet("%m/%d/%Y")),
    std::locale(std::locale::classic(), new date_input_facet("%d-%b-%Y")),
    std::locale(std::locale::classic(), new date_input_facet("%Y%m%d")),
};

Utilizo una serie de cadenas de fecha de 20170101 a 20170131 para probar esto. Luego imprimo las cadenas de fecha originales, la fecha que se analizó, junto con el índice del vector date_formats que funcionó para el análisis.

Para 20170101 a 201700129, dice que el índice 0 funcionó y que se supone que tiene el formato "% Y-% m-% d" con los guiones?!?! Además, donde van los guiones, tengo números, por lo que se lee 20170101 como 2017-10, luego suelta el último guión y lo interpreta como octubre de 2017, que sin fecha es el 1 de octubre de 2017. ¿Por qué haría eso cuando no es El formato que se suponía que debía usar?

Algunos resultados que se pueden ver en mi coliru (pY se analiza año, etc.):

YYYYMMDD    pY     pM   pD  format_index
20170101    2017    Oct 1   0
20170102    2017    Oct 1   0
20170103    2017    Oct 1   0
20170104    2017    Oct 1   0
20170105    2017    Oct 1   0

Para 20170130, 20170131, se informa el índice de formato correcto (el quinto) para "% Y% m% d".

¿Algunas ideas? Solo quiero que se use la cadena de formato precisa que pasé.

Respuestas a la pregunta(2)

Su respuesta a la pregunta