Używam w moim projekcie Boost's datetime library. Byłem bardzo szczęśliwy, gdy odkryłem, że ma on typy czasu trwania na godziny, dni, miesiące, lata itp., I zmieniają one swoją wartość w oparciu o to, do czego je dodajesz (np. Dodawanie 1 miesiąca przesuwa miesiąc o część daty , nie dodaje tylko 30 dni lub somesuch). I myślał tej nieruchomości przeznaczone do typu dni, ale postanowiłem go przetestować przed I umieścić go w produkcji ...boost local_date_time math wrong?
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());
}
Powyżej zobaczysz moje testów jednostkowych CppUnit. Nie powiedzie się we wskazanej linii przez 2, czego oczekiwałbym, gdyby days() tylko dodał 24 godziny, zamiast 1 logicznego dnia (ponieważ przejście DST powoduje, że 2010-03-14 trwa 23 godziny w EST).
Czy robię coś nie tak? Czy to błąd? Czy całkowicie błędnie zrozumiałem cel projektu biblioteki w odniesieniu do tego rodzaju matematyki?
jest to doskonały przykład, dlaczego wszyscy powinniśmy napisać kod wiązki przewodów testowych - porównanie oczekiwanych do rzeczywistych – slf