Я пользуюсь библиотекой даты и времени Повышения в своем проекте. Я был очень счастлив, когда я обнаружил, что это имеет типы продолжительности времени в течение многих часов, дней, месяцев, лет, и т.д., и они изменяют свое значение на основе того, что Вы добавляете их к (т.е. добавляете, что 1 месяц совершенствует часть месяца даты, это только добавляет 30 дней или somesuch). Я думал это свойство, сохраненное для дневного типа, но я решил протестировать его, прежде чем я ввел его в эксплуатацию...
local_date_time t1(date(2010, 3, 14), hours(1), easternTime, false); // 1am on DST transition date
{
CPPUNIT_ASSERT_EQUAL(greg_year(2010), t1.local_time().date().year());
CPPUNIT_ASSERT_EQUAL(greg_month(3), t1.local_time().date().month());
CPPUNIT_ASSERT_EQUAL(greg_day(14), t1.local_time().date().day());
CPPUNIT_ASSERT_EQUAL(1L, t1.local_time().time_of_day().hours());
CPPUNIT_ASSERT_EQUAL(0L, t1.local_time().time_of_day().minutes());
CPPUNIT_ASSERT_EQUAL(0L, t1.local_time().time_of_day().seconds());
}
t1 += days(1); // the time in EST should now be 1am on the 15th
{
CPPUNIT_ASSERT_EQUAL(greg_year(2010), t1.local_time().date().year());
CPPUNIT_ASSERT_EQUAL(greg_month(3), t1.local_time().date().month());
CPPUNIT_ASSERT_EQUAL(greg_day(15), t1.local_time().date().day());
CPPUNIT_ASSERT_EQUAL(1L, t1.local_time().time_of_day().hours()); // fails, returns 2
CPPUNIT_ASSERT_EQUAL(0L, t1.local_time().time_of_day().minutes());
CPPUNIT_ASSERT_EQUAL(0L, t1.local_time().time_of_day().seconds());
}
Выше Вы будете видеть мой модульный тест CPPUNIT. Это перестало работать в обозначенной строке с 2, который является тем, что я ожидал бы, добавили ли дни () просто 24 часа вместо 1 логического дня (так как переход DST заставляет 14.03.2010 быть 23 часа длиной в EST).
Я делаю что-то не так? Действительно ли это - ошибка? Я просто полностью неправильно понимал цель дизайна библиотеки относительно этого вида математики?
Я думаю, проблема в представлении спрашивающего о том, что такое день. Он хочет, чтобы здесь был день «свидания», а не 24 часа, но просить об этом неразумно.
Если вы работаете по местному времени, вы обязательно столкнетесь со специфическими эффектами. Например, что вы ожидаете, если в часовом поясе, который переводит часы вперед с 1:00 до 2:00, если при расчете «добавить день даты» по местному времени необходимо установить (не существует) 1,30 утра соответствующего воскресного утра?
Расчет времени заставил двигаться вперед на 24 часа - он должен работать по базовому времени UTC.
Чтобы выполнить расчет «прыжок на один день», как описано, работайте с типом даты Boost и добавляйте только время дня в качестве последнего действия.
Возможность продвинуть месяц вперед совершенно иная, потому что, в отличие от дня, календарный месяц не имеет особого значения как продолжительность. И это тоже вызывает проблемы: если вы перейдете на один календарный месяц с 31 января, а затем вернетесь на один календарный месяц назад, какая дата у вас в итоге?
Вместо добавления date_duration дней объекта, вы должны создать объект boost :: posix_time :: time_duration и добавить его в свой локальный время, например: boost :: posix_time :: time_duration td (24, 0, 0, 0); // 24 часа, 0 минут, секунд, нано boost :: local_time :: local_date_time later = now + td; // предполагая, что сейчас ваше начальное // local_date_time, 2010-3-14 // позже теперь будет локальный объект date_time, который полностью учитывает DST!