std :: time_get - 世纪?

时间:2013-02-01 22:48:38

标签: c++ date stl

有没有办法告诉std::time_get get_date它是什么世纪?我们处理1900年之前的日期。是否有更好的C ++日期时间库可以允许这个?我们有一个处理少数文化的内部解决方案,但get_date似乎可以处理所有文化,所以作为最后的手段,所有文化都是好的...

2 个答案:

答案 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转换说明符的选项(在链接提议中指定)。