簡體   English   中英

提升local_date_time數學錯誤?

[英]boost local_date_time math wrong?

我在項目中使用Boost的datetime庫 當我發現它的持續時間類型為小時,天,月,年等時,我感到非常高興,並且它們會根據您添加的時間來更改其值(即,將日期的月份部分提前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());
}

在上方,您將看到我的CPPUNIT單元測試。 它在指示的行2處失敗,這是如果days()僅增加24小時而不是1個邏輯天,那是我所期望的(因為DST過渡導致2010-03-14在EST中的時間為23小時)。

難道我做錯了什么? 這是一個錯誤嗎? 我是否就這種數學完全誤解了庫的設計目標?

我認為問題出在問問者對一天是什么的概念。 他希望今天在這里是“約會”的日子,而不是24小時,但這並不是一個合理的要求。

如果在當地時間工作,那一定會遇到奇特的影響。 例如,如果在將時鍾從凌晨1點推遲到凌晨2點的時區中,如果您的本地時間“添加日期日”計算應在相關的周日上午將凌晨1點(不存在)設置為1.30,會發生什么情況?

一時間計算得到了前進24小時-它必須在底層UTC時間操作。

要按照上述說明進行“一日跳轉”計算,請使用Boost的日期類型,並僅將一天中的時間添加為最終操作。

可以提前一個月的業務是完全不同的,因為與一天不同,日歷月沒有特定的含義作為持續時間。 這也會帶來麻煩:如果您從1月31日開始提前一個日歷月,然后再返回一個日歷月,那么您將在哪個日期結束?

與其添加date_duration對象的天數, 不如創建一個boost :: posix_time :: time_duration對象並將其添加到本地時間,就像這樣:boost :: posix_time :: time_duration td(24,0,0,0); // 24小時,0分鍾,秒,nano boost :: local_time :: local_date_time以后= now + td; //假設現在是您的開始// local_date_time,2010-3-14 //以后將是一個本地date_time對象,它充分考慮了DST!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM