2

ユーザーが日付範囲を選択し、日付範囲内で適用される曜日にチェックを入れたり外したりできる UI を作成しています。

日付範囲のコントロールはDateTimePickersで、曜日はCheckBoxes

UI のモックアップは次のとおりです。

From Date: (dtpDateFrom)
To Date: (dtpDateTo)

[y] Monday, [n] Tuesday, [y] Wednesday, (etc)

日付範囲だけでなく、チェックされた (または選択された) 曜日に基づいて、合計日数を表示する最良の方法は何ですか?

日付範囲をループするのが私の唯一のオプションですか?

4

2 に答える 2

5

これが私がそれにアプローチする方法です:

  • 最初と最後の日付の曜日 (ダウ) を見つける
  • 初日を前日と同じダウに繰り上げます。対象となる店舗移動日数
  • 最初と最後の間の週数を計算する
  • 1 週間に含まれる日数 * 週数 + 含まれる移動日数を計算します。

擬似コードとして:

 moved = start + end_dow - start_dow
 extras = count included days between start and moved
 weeks = ( end - moved ) / 7
 days = days_of_week_included * weeks + extras

開始日と終了日がどれほど離れていても、これには一定の時間がかかります。

このアルゴリズムの実装の詳細は、使用している言語とライブラリによって異なります。可能であれば、C++ と boost::date_time をこの種のものに使用します。

于 2008-09-25T10:44:00.700 に答える
2

ループスルーが唯一の選択肢ではありません.減算を実行て合計日数を計算し、それらの日を含む週の範囲ごとに「スキップされた」日付ごとに1を減算することができます. 1 日が範囲の最初または最後にある部分的な週の 1 つに到達するかどうかを判断して を追加する#weeks * skipped days in a weekまでに、コードは単純に数えた場合よりも複雑になりますが、日付範囲を指定すると、パフォーマンスが向上する可能性があります。

私があなたなら、単純なループ オプションを作成し、プロファイリングでボトルネックであることが判明した場合は、それを書き直します。

于 2008-09-25T10:37:20.763 に答える