4

私たちが持っている古い C++ MFC プログラムのバグで、固定基準日からの特定の日付のオフセット (日数) を計算することがわかりました。何らかの理由で結果が 1 つずれていたので、元のプログラマーが CTimeSpan.GetDays() メソッドを使用した場所まで追跡しました。ドキュメントによると:

夏時間により、GetDays が驚くべき結果を返す可能性があることに注意してください。たとえば、DST が有効な場合、GetDays は 4 月 1 日から 5 月 1 日までの日数を 30 ではなく 29 と報告します。これは、4 月の 1 日が 1 時間短縮されるため、1 日としてカウントされないためです。

私が提案する修正は、(obj.GetTotalHours()+1)/24代わりに使用することです。これは毎日ほぼ同じ時間に実行されるバッチ ジョブなので、すべての問題をカバーできると思いますが、実装する前にここの賢い人にもっと良い方法があるかどうか尋ねてみようと思いました。

これは単なる副次的な問題ですが、プログラムがいつでも実行できる場合、これがどのように処理されるかにも興味があります。

4

2 に答える 2

2

あなたの修正は、イベントが毎日同じ時間に発生する限り、2 つの時間の間の 24 時間の期間全体を取得するために正常に機能します。そうしないと、式の「+1」がオフバイワンエラーにつながる可能性があります。

1 日の何時にイベントが発生したかは気にせず、単にその日を知りたい場合があります。その場合、時間、分、秒をゼロにしてから、式を使用する必要があります。

CTime startDay(start.GetYear(), start.GetMonth(), start.GetDay(), 0, 0, 0);
CTime finishDay(finish.GetYear(), finish.GetMonth(), finish.GetDay(), 0, 0, 0);
int days = ((finishDay - startDay).GetTotalHours() + 1) / 24;
于 2008-10-28T16:01:03.893 に答える