2010-02-11 11 views
8

내 프로젝트에 Boost's datetime library을 사용하고 있습니다. 시간, 일, 월, 년 등의 기간 유형이 있다는 것을 발견했을 때 매우 기뻤습니다. 추가 한 항목에 따라 가치를 바꿉니다 (즉, 1 개월 전진하면 월 부분을 추가합니다). , 그것은 단지 30 일 또는 somesuch를 추가하지 않습니다). 나는 는 일 유형 개최이 속성을 생각했지만 생산에 넣어 전에 내 CppUnit을 단위 테스트를 볼 수 있습니다 위의 나는 ... 그것을 테스트local_date_time 수학을 잘못 입력 했습니까?

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()); 
} 

을 결정했다. DST 전환으로 인해 EST에서 23 시간이되는 2010-03-14 이후 1 일의 논리적 인 날 대신 days()가 단지 24 시간 만 추가하면 예상되는 줄은 2로 표시되는 줄에서 실패합니다.

내가 잘못 했나요? 이거 버그 야? 이런 종류의 수학과 관련하여 도서관의 디자인 목표를 완전히 오해 했습니까? 대신 date_duration 객체 일을 추가

+0

이것은 테스트 하네스 코드를 모두 써야하는 이유의 훌륭한 예입니다. 실제와 비교해 보겠습니다. – slf

답변

5

나는이 문제가 하루가 무엇인지 묻는 사람의 생각에 있다고 생각한다. 그는 그것이 24 시간보다는 오히려 '날짜'의 날이되기를 바라고 있지만, 그것은 합리적으로 요구할 수있는 것이 아닙니다.

현지 시간으로 작업하는 경우 특유의 영향이 발생합니다. 예를 들어 현지 시간 '날짜 추가 일'계산에서 관련 일요일 아침에 (존재하지 않는) 1.30am을 설정해야한다면, 오전 1 시부 터 2 시까 지 시계를 앞당기는 시간대에서 어떤 일이 발생할 것으로 예상합니까?

시간 계산에 이 있고 앞으로 24 시간 앞으로 이동하려면이 있으며 기본 UTC 시간으로 작동해야합니다.

설명대로 '일일 이동'계산을하려면 Boost의 날짜 유형을 사용하고 마지막 동작으로 시간 만 추가하십시오.

하루를 달리하는 것과는 달리, 한 달은 특정 기간의 의미가 없으므로 한 달 전진 할 수있는 사업은 매우 다릅니다. 그리고 그것은 또한 문제를 일으 킵니다 : 1 월 31 일부터 1 개월을 앞당겨서 1 개월 간 돌아 간다면, 어떤 날짜에 끝나나요?

+0

Upvoted this. OP의 핵심 문제는 그러한 일이 없을 때 현지 시간에 안정적인 수학을 기대하고 있다는 것입니다. 30/360이나 변이를 명시 적으로 사용하는 다양한 금융 도메인이 있으므로 특정 업무를보다 단순하게하기 위해 영업일 30 일의 의견은 재미 있습니다. – sdg

+0

부스트의 월 및 연도 유형은 내가 설명한대로 동작하며 willw와 sdg는 http://www.boost.org/doc/libs/1_40_0/doc/html/date_time/gregorian.html#additional_duration_types에 대해 이야기하고 있습니다. 나는 그저 그날의 유형과 같은 것을 기대했다. 시간 계산은 UTC 시간에 작동 할 필요가 없습니다 ...이 이유는 ptime (UTC의 경우)과 local_date_time (현지 시간의 경우) 계산을 모두 제공했기 때문입니다. 이것은 당신이 틀렸다는 것을 의미하는 것은 아니지만 Boost 문서로 자신의 오해를 해결할 때까지 대답을 받아들이지 않을 것입니다. – rmeador

+0

부스트의 월 및 연도 유형은 문서를 인용하기 위해 일의 범위를 논리적으로 표현한 것으로 그레고리언 :: 날짜 유형과 연관되어 있습니다. 귀하의 예에서 귀하의 유형은 local_date_time입니다. 의미 상으로, 날짜의 1 일 단위 단위가 아닌 연속적인 시간 흐름에 관심을 표명합니다. 따라서 날짜 시간 변수에 하루를 추가하면 날짜 기간에서 1 일에서 24 시간으로 변환됩니다. 다른 모든 것은 이것에서 따릅니다. 죄송합니다. 오해는 당신 것입니다. 수업은 실망했습니다. – willw

0

, 당신은 :: posix_time :: TIME_DURATION 객체를 부스트를 작성해야하며,과 같이, 현지 시간이 추가 : 향상을 :: posix_time :: TIME_DURATION의 TD (24, 0 , 0, 0); // 24 시간, 0 분, 초, 나노 boost :: local_time :: local_date_time later = now + td; // 이제 시작이 // local_date_time이라고 가정하면 2010-3-14 // 나중에 DST를 완전히 고려한 로컬 date_time 개체가됩니다!

+0

이것은 OP 문제를 해결하지 못합니다. 't1 + = days (1);'을't1 + = time_duration (24, 0, 0, 0);으로 대체하면 같은 결과가 나온다. –

관련 문제