我正在写一种HTTP代理,所以我需要能够做3件事:
- 根据RFC 2616, sec 3.3中指定的3种格式解析HTTP日期,
- 将文件日期时间转换为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
我很确定Boost date_time可以完成所有这些,但是我在编号1时遇到了一些麻烦。有没有人有过这样的代码?也许我没有熟练地使用谷歌,但我无法找到一个如何在任何地方都能提升的例子。 谢谢你的帮助! 更新:我有一个解决方案,但第二个解析器错误的一年(我猜是因为它是一个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 ''