質問

私は中ブーストの日時ライブラリを使用しています私のプロジェクト。私はそれが時間の持続時間のためのタイプ、日、月、年などを持っていることを発見したとき、私はとても幸せだった、と彼らはあなたがそれらを追加しているものに基づいてその値を変更する(つまり、1ヶ月を追加すると、日付の月の部分を前進させます、それだけで30日間またはsomesuch)を追加しません。私はが思ったの私は生産にそれを置く前に、私はそれをテストすることを決めたが、日のタイプのために開催されたこのプロパティ...

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ユニットテストが表示されます上。それは私が(DST遷移がESTで23時間長くする2010-03-14の原因となるので)日()は単に論理的な一日24時間、代わりの1を追加した場合は期待するものである2で示すライン、で失敗します。

私が何か間違ったことをやっていますか?これはバグですか?私は完全に数学のこの種に対するライブラリーの設計目標を誤解していましたか?

役に立ちましたか?

解決

私はこの問題は、日が何であるかのアスカーの概念であると思います。彼はそれが24時間ではなく、ここで「日付」の日であることを望んでいるが、それが求めるために合理的なものではありません。

は、ローカルタイムで働いている場合、1は独特のエフェクトが発生したためにバインドされています。たとえば、あなたはあなたのローカル時間が計算関連の日曜日の朝に(実在しない)1.30amを設定する必要があります「日付の日が追加」の場合、午前2時まで午前1時から前方に時計を置くタイムゾーンで、場合に発生することが何を期待していますか?

時間の計算は、が前方に24時間を移動するために持っている - それは、基礎となるUTC時間に作動しなければなりません。

説明したように、「ジャンプ1日の計算を行うブーストの日付タイプと協力、そして唯一の最終アクションとしての時刻に追加します。

、日とは異なり、カレンダーの月は期間としては特定の意味を持たないので、月を進めることができるというビジネスは、かなり異なっています。そして、それはあまりにもトラブルの原因:あなたは1つのカレンダーの月が1月31日から進出した後、1暦月戻った場合、あなたが何日に終わるのですか?

他のヒント

の代わりに追加ののdate_duration のオブジェクトの日、あなたはブースト:: posix_time :: TIME_DURATIONオブジェクトを作成する必要がありますので、同じように、あなたのローカル時間にこれを追加します。 後押し:: posix_time :: TIME_DURATIONのTD(24、0、0、0); // 24時間、0分、秒、ナノ 後押し:: LOCAL_TIME :: local_date_timeは後で= NOW + TD。 //今、あなたの出発// local_date_time、2010年3月14日であると仮定すると //後の今、DSTの完全なアカウントを取るローカル日付時刻オブジェクトになります!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top