3

有什么办法可以知道std::time_get get_date现在是什么世纪?我们处理 1900 年之前的日期。是否有更好的 C++ 日期时间库允许这样做?我们有一个内部解决方案,可以处理几种文化,但get_date似乎可以处理所有文化,所以作为最后的手段,它是一个很好的解决方案……

4

2 回答 2

3

您可以尝试查看Boost.Gregorian

于 2013-02-01T22:51:13.117 回答
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)” 。当存储在 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).

于 2013-03-03T23:38:50.607 回答