有没有办法告诉std::time_get get_date
它是什么世纪?我们处理1900年之前的日期。是否有更好的C ++日期时间库可以允许这个?我们有一个处理少数文化的内部解决方案,但get_date
似乎可以处理所有文化,所以作为最后的手段,所有文化都是好的...
答案 0 :(得分:3)
您可以尝试查看Boost.Gregorian
答案 1 :(得分:1)
如果您有一个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)。”存储在std::tm
时,它将是1900年以后的年数,但该值由int
保留,接受否定值。
完整的转换说明符集由C ++ 11指定为ISO / IEC 9945函数strptime
的有效集。
如果您正在寻找一个功能齐全的日期库,Rapptz提到的boost::datetime
是一个很好的建议。
我们也欢迎您使用我的个人日期库,该库是向C ++委员会提出并被拒绝的单一标题和单一来源。我提到,因为源仍然在命名空间std :: chrono中(出于提议目的),但是如果使用它,则应该更改命名空间。 Here's记录库的提案,以及指向单一标头和源实现的链接。
翻译上面的例子如下:
#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
实现时,此库还依赖于C ++ 11 std::get_time
操纵器进行输入,并包含用于更改I / O转换说明符的选项(在链接提议中指定)。