boost :: locale :: date_time:如何从Boost C ++中的date_time对象获取数据?

时间:2017-06-28 20:16:46

标签: c++ boost boost-date-time boost-locale

我正在尝试在我的代码中处理日期和时间,并且已经指向了boost库的方向 - 特别是boost :: locale :: date_time(部分因为这可以让我避免夏令时怪异让我以前的实施变得困难了。)

然而,我得到了不一致的结果。当我在date_time对象中存储日期并稍后尝试从中获取数据时,它是不正确的。这是一个例子:

#include <boost\\asio\\error.hpp>
#include <boost\\locale.hpp>
using namespace std;

int main()
{
    // Necessary to avoid bad_cast exception - system default should be fine
    boost::locale::generator gen;
    std::locale::global(gen(""));

    // Create date_time of 12/19/2016
    boost::locale::date_time dt = boost::locale::period::year(2016) + boost::locale::period::month(12) + boost::locale::period::day(19);

    unsigned int month = dt.get(boost::locale::period::month());
    unsigned int day = dt.get(boost::locale::period::day());
    unsigned int year = dt.get(boost::locale::period::year());

    cout << month << "/" << day << "/" << year << endl;

    // Expected output:  12/19/2016
    // Actual output:    0/19/2017
}

我做错了什么?我只是想提取保存的天,月,年,小时等。

谢谢。

编辑:我可能最初以不正确的方式设置date_time。假设我拥有整数(非字符串)格式的所有相关数据,是否有更好的方法来明确设置日期时间(例如,到12-19-2016)?

1 个答案:

答案 0 :(得分:1)

2016-04-05 + 12 months = 2017-04-05。这是有道理的,因为12个月是整整一年。

尝试添加11个月,然后增加以从基于0的月份调整为基于1的月份。

boost::locale::date_time dt = boost::locale::period::year(2016) + boost::locale::period::month(11) + boost::locale::period::day(19);

uint month = dt.get(boost::locale::period::month()) + 1;
uint day = dt.get(boost::locale::period::day());
uint year = dt.get(boost::locale::period::year());

cout << month << "/" << day << "/" << year << endl;