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), предполагая, что у меня есть все соответствующие данные в целочисленном (не строковом) формате?

0

Решение

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;
1

Другие решения

Других решений пока нет …