Considere esto como una continuación de this question. Básicamente, las funciones de formato de fecha/hora C++ parecen estar irremediablemente rotas, tanto que para hacer algo tan simple como convertir una cadena de fecha/hora en un objeto, realmente tienes que recurrir a Boost.Datetime o al viejo C strftime
/strptime
instalaciones.C++: convertir cadena de fecha/hora a tm struct
El problema es que ninguna de estas soluciones funciona directamente con la configuración local de C++ imbuida en un objeto iostream en particular. Las instalaciones de C usan la configuración regional de C/POSIX global, mientras que las instalaciones de E/S en Boost.Datetime parecen omitir por completo las configuraciones regionales de iostream al permitir al usuario establecer directamente los nombres de meses, días de la semana, etc., independientemente de la configuración regional.
Por lo tanto, quería algo que respetara las configuraciones locales imbuidas en un flujo de E/S particular que me permitiría convertir una cadena en struct tm
. Parecía bastante fácil, pero tropecé con obstáculos en cada esquina. Al principio, noté que algunas implementaciones del STL proporcionan una función no estándar std::time_get::get
, así que decidí implementar algo similar. Básicamente, simplemente iteraría sobre la cadena de formato y cada vez que tocara un indicador de formato, usaría uno de los recursos time_get (como get_monthname, get_weekday, get_year, etc.) para convertir la cadena de entrada en struct tm
. Esto parece bastante fácil, excepto que cada una de estas funciones requiere un rango de iterador exacto. No puede convertir "Monday,"
, tiene que ser "Monday"
exactamente, o la conversión falla. Dado que los iteradores deben ser istreambuf_iterator
, no puede simplemente escanear hacia adelante, porque cada incremento cambia la posición de obtención en el almacenamiento intermedio de flujo. Entonces, básicamente, primero tiene que iterar sobre la secuencia, copiando cada carácter en otro streambuffer, y luego cuando toca un delimitador (como un espacio o una coma), use el segundo streambuffer con las instalaciones time_get. Es literalmente como si los diseñadores de C++ hicieran todo lo posible para que esto fuera tan molesto como fuera posible.
Entonces, ¿hay una solución más fácil? ¿Qué hacen la mayoría de los programadores de C++ cuando necesitan convertir una cadena de fecha/hora en un objeto? ¿Simplemente tenemos que usar las instalaciones de C y perder las ventajas que vienen con las diferentes configuraciones locales imbuidas en diferentes objetos iostream?
¿Ha presentado algún error en contra de su biblioteca de C++? Quejas como esta impulsan su desarrollo. – Potatoswatter
'std :: time_get :: get' está definido por C++ 0x 22.4.5.1.1/6 ... Me acaba de ocurrir que tengo la página abierta, pero supongo que también está en C++ 03. – Potatoswatter
No está en C++ 03: está disponible en algunas implementaciones, pero no es estándar. –