повысить local_date_time математику неправильно?

Я пользуюсь библиотекой даты и времени Повышения в своем проекте. Я был очень счастлив, когда я обнаружил, что это имеет типы продолжительности времени в течение многих часов, дней, месяцев, лет, и т.д., и они изменяют свое значение на основе того, что Вы добавляете их к (т.е. добавляете, что 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).

Я делаю что-то не так? Действительно ли это - ошибка? Я просто полностью неправильно понимал цель дизайна библиотеки относительно этого вида математики?

8
задан rmeador 11 February 2010 в 15:26
поделиться

2 ответа

Я думаю, проблема в представлении спрашивающего о том, что такое день. Он хочет, чтобы здесь был день «свидания», а не 24 часа, но просить об этом неразумно.

Если вы работаете по местному времени, вы обязательно столкнетесь со специфическими эффектами. Например, что вы ожидаете, если в часовом поясе, который переводит часы вперед с 1:00 до 2:00, если при расчете «добавить день даты» по местному времени необходимо установить (не существует) 1,30 утра соответствующего воскресного утра?

Расчет времени заставил двигаться вперед на 24 часа - он должен работать по базовому времени UTC.

Чтобы выполнить расчет «прыжок на один день», как описано, работайте с типом даты Boost и добавляйте только время дня в качестве последнего действия.

Возможность продвинуть месяц вперед совершенно иная, потому что, в отличие от дня, календарный месяц не имеет особого значения как продолжительность. И это тоже вызывает проблемы: если вы перейдете на один календарный месяц с 31 января, а затем вернетесь на один календарный месяц назад, какая дата у вас в итоге?

5
ответ дан 5 December 2019 в 23:15
поделиться

Вместо добавления 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!

0
ответ дан 5 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: