rme*_*dor 8 c++ datetime boost date-math
我正在我的项目中使用Boost的日期时间库.当我发现它有持续时间类型的小时,天,月,年等时,我感到非常高兴,并且它们会根据您添加它们的内容来更改它们的值(即,在月份的一部分中添加1个月的预付款) ,它不只是添加30天或某些).我认为这个属性适用于日期类型,但我决定在我投入生产之前测试它...
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());
}
Run Code Online (Sandbox Code Playgroud)
上面你会看到我的CPPUNIT单元测试.它在指示的2行失败,如果days()仅仅增加了24小时而不是1个逻辑日(因为DST转换导致2010-03-14在EST中长达23个小时),这就是我所期望的.
难道我做错了什么?这是一个错误吗?在这种数学方面,我是否完全误解了图书馆的设计目标?
我认为问题在于提问者关于一天是什么的概念.他希望这是一个'约会'日,而不是24小时,但这不是一个合理的要求.
如果在当地工作,一定会遇到特殊的影响.例如,如果您在当地时间"添加日期日"计算应该设置(不存在的)相关星期天早上1点30分的时区,将时钟从凌晨1点延长到凌晨2点,您期望会发生什么?
时间计算已经得到了前进24小时-它必须在底层UTC时间操作.
要按照描述进行"跳一天"计算,请使用Boost的日期类型,并仅在时间中添加最终操作.
能够推进一个月的业务是完全不同的,因为与一天不同,一个日历月没有特定的含义作为持续时间.它也会带来麻烦:如果你从1月31日开始提前一个日历月,然后又回到一个日历月,那么你最终会在几个月结束?
| 归档时间: |
|
| 查看次数: |
1612 次 |
| 最近记录: |