【发布时间】:2010-02-11 15:26:34
【问题描述】:
我在我的项目中使用Boost's datetime library。当我发现它具有小时、天、月、年等的持续时间类型时,我感到非常高兴,并且它们会根据您添加的内容来更改它们的值(即在日期的月份部分增加 1 个月,它不只是增加 30 天或类似的时间)。我认为这个属性是为 days 类型保留的,但我决定在将其投入生产之前对其进行测试......
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 失败,如果 days() 仅添加 24 小时而不是 1 个逻辑天(因为 DST 转换导致 2010-03-14 在 EST 中为 23 小时),这是我所期望的。
我做错了吗?这是一个错误吗?我是不是完全误解了图书馆在这种数学方面的设计目标?
【问题讨论】:
-
这是一个很好的例子,说明了为什么我们都应该编写测试工具代码 - 将预期值与实际值进行比较
标签: c++ datetime boost date-math