使用boost date_time来解析和创建HTTP日期

我正在写一种HTTP代理,所以我需要能够做3件事:

  1. 根据RFC 2616, sec 3.3中指定的3种格式解析HTTP日期,
  2. 将文件日期时间转换为HTTP日期字符串,以及
  3. 输出日期到一个字符串。

作为参考,这些是我需要解析的日期时间的例子。我只会输出第一种格式:

  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 ''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值