8

我在我的项目中使用Boost 的日期时间库。当我发现它具有小时、天、月、年等的持续时间类型时,我感到非常高兴,并且它们会根据您添加的内容来更改它们的值(即在日期的月份部分增加 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 小时),这是我所期望的。

难道我做错了什么?这是一个错误吗?我只是完全误解了图书馆在这种数学方面的设计目标吗?

4

2 回答 2

5

我认为问题在于提问者对一天是什么的概念。他希望这是一个“约会”的日子,而不是 24 小时,但这不是一个合理的要求。

如果在当地时间工作,必然会遇到奇特的效果。例如,如果在将时钟从凌晨 1 点提前到凌晨 2 点的时区中,如果您的本地时间“添加日期日期”计算应将(不存在)设置为相关周日早上的凌晨 1.30,您预计会发生什么?

时间计算必须提前24 小时 - 它必须在基础 UTC 时间上运行。

要按照描述进行“跳转一天”计算,请使用 Boost 的日期类型,并且只添加一天中的时间作为最终操作。

能够提前一个月的业务是完全不同的,因为与一天不同,日历月作为持续时间没有特定含义。它也带来了麻烦:如果你从 1 月 31 日开始提前一个日历月,然后再返回一个日历月,你最终会得到什么日期?

于 2010-02-16T12:13:33.063 回答
0

与其添加date_duration对象 days ,不如创建一个 boost::posix_time::time_duration 对象并将其添加到本地时间,如下所示: boost::posix_time::time_duration td ( 24 , 0 , 0 , 0 ) ; //24小时,0分,秒,nano boost::local_time::local_date_time later = now + td ; //假设现在是您的开始 //local_date_time , 2010-3-14 //later 现在将是一个充分考虑 DST 的本地 date_time 对象!

于 2010-02-11T17:07:02.010 回答