1

異常な方法で保存された 1 週間の範囲の日付の配列があります。

日付は次の数値形式で保存されます: 12150

左から右へ:

1 桁目は日を表します: 1 = 日曜日、2 = 月曜日、3 = 火曜日、....、7 = 土曜日

次の 2 桁は 24 時間制の時間を表します: 00 = 真夜中、23 = 午後 11 時

次の 2 桁は分を表します: 00-59

入力日と開始日と終了日が与えられた場合、入力日が開始日と終了日の間にあるかどうかを知る必要があります。

現在、100% の確率で機能すると思われるアルゴリズムがありますが、よくわかりません。

いずれにせよ、これを行うためのより適切で簡単な方法がおそらくあると思います。そのアルゴリズムが何であるかを誰かが知っているかどうか疑問に思っていました。

そうでない場合は、誰かが私の作業を再確認して、有効なケースの 100% で実際に機能することを確認できれば素晴らしいと思います.

私が今持っているものは次のとおりです。

if (startDate < inputDate && 
    endDate > inputDate) {
        inRange = yes;    
}
else if (endDate < startDate) {
        if((inputDate + 72359) > startDate &&
          (inputDate + 72359) < endDate) {
          inRange = yes; 
        }
        else if((inputDate + 72359) > startDate &&
               (inputDate + 72359) < (endDate + 72359)) {
          inRange = yes;   
        }

}
4

6 に答える 6

0

より良いアプローチは、データを正規化し、すべての曜日の値を開始日との相対値に変換することです。このようなもの:

const int dayScale = 10000;  // scale factor for the day of the week

int NormalizeDate(int date, int startDay) 
{
    int day = (date / dayScale) - 1;  // this would be a lot easier if Sunday was 0 
    int sday = startDay - 1;  

    if (day < sday)  
        day = (day + 7 - sday) % 7;

    return ((day+1) * dayScale) + (date % dayScale);
}

int startDay = startDate / dayScale;  // isolate the day of the week

int normalizedStartDate = NormalizeDate(startDate, startDay);
int normalizedEndDate = NormalizeDate(endDate, startDay);
int normalizedInputDate = NormalizeDate(inputDate, startDay);

inRange = normalizedInputDate >= normalizedStartDate && 
          normalizedInputDate <= normalizedEndDate;

これは書かれているとおりに機能すると確信しています。いずれにせよ、概念は複数の比較よりも明確です。

于 2009-03-12T06:49:40.013 に答える