gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:03 28 4
gpt4 key购买 nike

我正在编写一种 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com