std::chrono::time_point
Howard Hinnantget_time
的免费、开源、仅标头、日期/时间库可以将这些格式解析为strptime
. 它确实需要使用std::istringstream
虽然。这是它的样子:
#include "date.h"
#include <sstream>
std::chrono::system_clock::time_point
parse_RFC_1123(const std::string& s)
{
std::istringstream in{s};
std::chrono::system_clock::time_point tp;
in >> date::parse("%a, %d %b %Y %T %Z", tp);
return tp;
}
std::chrono::system_clock::time_point
parse_RFC_850(const std::string& s)
{
std::istringstream in{s};
std::chrono::system_clock::time_point tp;
in >> date::parse("%a, %d-%b-%y %T %Z", tp);
return tp;
}
std::chrono::system_clock::time_point
parse_asctime(const std::string& s)
{
std::istringstream in{s};
std::chrono::system_clock::time_point tp;
in >> date::parse("%a %b %d %T %Y", tp);
return tp;
}
可以这样练习:
#include <iostream>
int
main()
{
auto tp = parse_RFC_1123("Sun, 06 Nov 1994 08:49:37 GMT");
using namespace date;
std::cout << tp << '\n';
tp = parse_RFC_850("Sunday, 06-Nov-94 08:49:37 GMT");
std::cout << tp << '\n';
tp = parse_asctime("Sun Nov 6 08:49:37 1994");
std::cout << tp << '\n';
}
和输出:
1994-11-06 08:49:37.000000
1994-11-06 08:49:37.000000
1994-11-06 08:49:37.000000
解析标志%a
和%b
通常依赖于语言环境。然而,如果你用它编译这个库,-DONLY_C_LOCALE=1
它就会变得独立于语言环境。无论哪种方式,它都应该给出相同的结果。但是从实际的角度来看,如果你在没有编译的情况下 -DONLY_C_LOCALE=1
没有得到上面的结果,你必须向你的 std::lib 供应商提交一个错误报告。
如果您编译时 -DONLY_C_LOCALE=1
没有得到上述结果,请摇晃我的笼子,我会在几天内修复它,如果不是几小时的话。