有什么办法可以知道std::time_get get_date
现在是什么世纪?我们处理 1900 年之前的日期。是否有更好的 C++ 日期时间库允许这样做?我们有一个内部解决方案,可以处理几种文化,但get_date
似乎可以处理所有文化,所以作为最后的手段,它是一个很好的解决方案……
2 回答
您可以尝试查看Boost.Gregorian
如果您有 C++11 环境(至少在 std::lib 实现中),您可以使用新的std::get_time
操纵器:
template <class charT>
unspecified
get_time(struct tm* tmb, const charT* fmt);
例如:
#include <iomanip>
#include <sstream>
#include <iostream>
#include <ctime>
int
main()
{
std::istringstream infile("1799-03-03");
std::tm tm = {0};
infile >> std::get_time(&tm, "%Y-%m-%d");
std::cout << tm.tm_year + 1900 << '\n';
}
这应该输出:
1799
%Y
转换说明符被指定为“作为十进制数的年份(例如,1997)” 。当存储在 a 中std::tm
时,它将是 1900 年之后的年数,但该值由 a 持有int
,接受负数。
全套转换说明符由 C++11 指定为对 ISO/IEC 9945 函数有效的集合strptime
。
如果您正在寻找功能齐全的日期库,boost::datetime
那么 Rapptz 提到的那个是一个很好的建议。
也欢迎您使用我的个人日期库,它是向 C++ 委员会提出并被拒绝的单一标题和单一来源。我提到,由于源仍在命名空间 std::chrono 中(出于建议目的),但如果你使用它,你应该更改命名空间。 这是记录库的提案,以及指向单个标头和源实现的链接。
翻译上面的例子看起来像:
#include "date"
#include <iostream>
#include <sstream>
int
main()
{
std::istringstream infile("1799-03-03");
std::chrono::date date;
infile >> date;
std::cout << date.year() << '\n';
}
再次输出:
1799
As implemented this library also depends on the C++11 std::get_time
manipulator for input, and includes options for varying the I/O conversion specifier (specified in the linked proposal).