Я пишу своего рода HTTP-прокси, так что мне нужно, чтобы быть в состоянии сделать 3 вещи:Использование повышения date_time для разбора и создания HTTP-даты
- разбора HTTP-дата получая любой из 3 форматы, указанные в RFC 2616, sec 3.3,
- Преобразование даты даты файла в строку HTTP-даты и
- Вывести дату в строку.
Для справки, тезисы являются примерами даты-времени, которые мне нужны для синтаксического анализа. Я буду выводить только первый формат:
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
Я уверен, что подталкивания date_time может сделать все это, но у меня возникают некоторые проблемы с номером 1. Кто-нибудь уже есть код, чтобы сделать это? Возможно, я не использую google профессионально, но я не могу найти пример того, как это сделать с повышением в любом месте.
Спасибо за помощь!
UPDATE: У меня есть решение, но у второго парсера есть неправильный год (я думаю, потому что это 2-значный год), а последний синтаксический анализатор дает исключение (см. Вывод ниже).
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;
}
Выход:
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 ''
Вы всегда должны включать заголовки в верхней части кода. это значит, что люди могут поднять ваш код и скомпилировать его. –