我正在写一种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 ''
作者在开发HTTP代理时遇到日期时间格式处理的挑战,特别是使用Boostdate_time库解析RFC822、RFC850和ANSIC的asctime()格式的日期时间。已尝试使用该库的不同解析器,但在处理某些格式(如2位数年份)时遇到错误。代码示例显示了成功和失败的解析情况。
474

被折叠的 条评论
为什么被折叠?



