boost::locale::date_time: Как получить данные из объекта date_time в Boost C++?

Я пытаюсь обработать дату и время в своем коде, и меня указали в направлении библиотеки повышения, в частности, 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
}

Что я делаю неправильно? Я просто хочу извлечь сохраненные дни, месяцы, годы, часы и т. Д.

Спасибо.

РЕДАКТИРОВАТЬ: Возможно, я изначально устанавливаю дату и время в неправильной манере. Есть ли лучший способ явно установить дату (например, 12-19-2016), предполагая, что у меня есть все соответствующие данные в целочисленном (не строковом) формате?

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;
Другие вопросы по тегам