c++ - 使用 boost date_time 解析和创建 HTTP 日期

标签 c++ http boost boost-date-time

我正在编写一种 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 项时遇到了一些麻烦。是否有人已经有代码来执行此操作?也许我没有熟练地使用谷歌,但我找不到一个例子来说明如何在任何地方使用 boost 来做到这一点。

感谢您的帮助!

更新:我有一个解决方案,但是第二个解析器有错误的年份(我猜是因为它是一个两位数的年份)并且最后一个解析器给出了一个异常(见下面的输出)。

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 ''

最佳答案

我不认为你需要走那么远去伸手去拿 Boost :) 您可以使用简单的 C 代码:

static const char format[] = "%a, %d %b %Y %H:%M:%S %Z"; // rfc 1123
struct tm tm;
bzero(&tm, sizeof(tm));
if (strptime(str, format, &tm)) {..}

关于c++ - 使用 boost date_time 解析和创建 HTTP 日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2838524/

相关文章:

c++ - std::next_permutation 的摊销复杂度?

c++ - 检测特定 C++ 类型是否有成员,排除继承的成员

c++ - 如何在没有 UTF-8 特定代码的情况下解析多语言文档

android - 多部分实体多图像不发送

c++ - 使用 Boost float 比较获取 bool 返回值

c++ - OpenGL/GLFW 显得透明

java - 不支持 Steammobile 协议(protocol)

php - 需要发送图片和文字到服务器

c++ - 如何使用 boost::regex 进行多次替换

c++ - 使用 CMake 查找使用 CLang 编译的 Boost