que estoy escribiendo una especie de proxy HTTP, así que tengo que ser capaz de hacer 3 cosas:impulsar el uso fecha_hora para analizar y crear HTTP fechas
- analizar un HTTP-fecha dada cualquiera de los 3 formatos especificados en RFC 2616, sec 3.3,
- Convierta una fecha de archivo a una cadena de fecha HTTP, y
- Imprima la fecha en una cadena.
Como referencia, estos son ejemplos de los tiempos de las fechas que necesito analizar. I es la salida sólo el primer formato:
Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
Estoy bastante seguro de fecha_hora Boost puedo hacer todo esto, pero estoy teniendo algunos problemas con el número 1. ¿Alguien ya tiene código para hacer esto? Tal vez no estoy usando Google de forma competente, pero no puedo encontrar un ejemplo de cómo hacerlo con el impulso en cualquier lugar.
¡Gracias por cualquier ayuda!
ACTUALIZACIÓN: Tengo una solución, pero el segundo analizador tiene el año incorrecto (supongo que porque es un año de 2 dígitos) y el último analizador ofrece una excepción (consulte el resultado a continuación).
try
{
// output time now in GMT
// format we want: Sun, 06 Nov 1994 08:49:37 GMT
boost::local_time::local_date_time t(boost::local_time::local_sec_clock::local_time(boost::local_time::time_zone_ptr()));
boost::local_time::local_time_facet* lf(new boost::local_time::local_time_facet("%a, %d %b %Y %H:%M:%S GMT"));
std::cout.imbue(std::locale(std::cout.getloc(), lf));
std::cout << t << std::endl;
// get a file mod time into the correct format
boost::filesystem::path p("../code/main.cpp");
boost::posix_time::ptime pt = boost::posix_time::from_time_t(
boost::filesystem::last_write_time(p));
boost::local_time::local_date_time t2(pt, boost::local_time::time_zone_ptr());
std::cout << t2 << std::endl;
std::stringstream ss;
ss.exceptions(std::ios_base::failbit);
// input date-time
boost::local_time::local_time_input_facet* lif1(new boost::local_time::local_time_input_facet("%a, %d %b %Y %H:%M:%S GMT"));
ss.imbue(std::locale(std::locale::classic(), lif1));
ss.str("Sun, 06 Nov 1994 08:49:37 GMT");
ss >> t;
std::cout << t << std::endl;
boost::local_time::local_time_input_facet* lif2(new boost::local_time::local_time_input_facet("%A, %d-%b-%y %H:%M:%S GMT"));
ss.imbue(std::locale(std::locale::classic(), lif2));
ss.str("Sunday, 06-Nov-94 08:49:37 GMT");
ss >> t;
std::cout << t << std::endl;
boost::local_time::local_time_input_facet* lif3(new boost::local_time::local_time_input_facet("%a %b %e %H:%M:%S %Y"));
ss.imbue(std::locale(std::locale::classic(), lif3));
ss.str("Sun Nov 6 08:49:37 1994");
ss >> t;
std::cout << t << std::endl;
}
catch (std::exception& e)
{
std::cout << "Exception: " << e.what() << std::endl;
}
Salida:
Sat, 15 May 2010 03:01:13 GMT
Sat, 15 May 2010 03:01:01 GMT
Sun, 06 Nov 1994 08:49:37 GMT
Sat, 06 Nov 2094 08:49:37 GMT
Exception: Parse failed. No match found for ''
siempre debe incluir encabezados en la parte superior de su código. esto es para que la gente pueda recoger su código y compilarlo. –