質問

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

  

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

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

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

役に立ちましたか?

解決

修正は、イベントが毎日同じ時間に発生する限り、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;

他のヒント

Markが提案したものに対する小さな変更であり、丸めに依存せずに動作します。ゼロのパラメーターをもう1つ CTime コンストラクターに追加するだけです。これにより、両方の時刻が標準時間になります(夏時間ではありません)。そのパラメーターのデフォルト値は-1です。これは、「夏時間が有効かどうかを自動的に計算する」ことを意味します。

// Discard hours, minutes, seconds, and daylight savings time
CTime startDay(start.GetYear(), start.GetMonth(), start.GetDay(), 0, 0, 0, 0);
CTime endDay(end.GetYear(), end.GetMonth(), end.GetDay(), 0, 0, 0, 0);

// Get number of days apart
CTimeSpan span = endDay - startDay;
int nDays = span.GetDays();

テスト済みで動作します。

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