1

シフト勤務の昼、夜、休日を表示するカレンダー ページを作成しています。

7日休み、4泊、3日休み、1日休み、3泊、3日休み、4日、28日というサイクルが繰り返されます。サイクルは常に金曜日に始まります。

4 つの異なるクルーがいて、それぞれが 1 週間おきに開始します。

したがって、最初の乗組員の 7 オフの最初の 28 日間サイクルの月、日、年だけを含む sql テーブルがあり、それをコレクションに吸い込み、フィールドを追加して、他の乗組員の開始 7 オフを計算します。

カレンダーは、休日、夜、日を色分けして表示します。そのため、リストを調べて、サイクルの最初の日を次の配列へのインデックスとして使用します。

static int[] DaysArray = new int[28] {0,0,0,0,0,0,0,2,2,2,2,0,0,0,1,1,1,0,2,2,2,0,0,0,1,1,1,1}; // 0 - day off, 1 - days, 2 - nights

私が興味を持っているのは、月の始まりが 28 日サイクルのどの時点であるかを判断することだけであり、残りの日を適切な色で色付けするだけです。これが私が苦労しているルーチンです:

protected int GetDayNightOff(int day)
{
    day--;
    day -= 28;
    day = Math.Abs(day);
    day--;
    return DaysArray[day];
}

サイクルの初日が 1 日である場合、インデックス 0 を使用して開始色を表示します。2 番目: インデックス 27; 3 番目: インデックス 26 など。簡単な解決策があることは知っていますが、頭を悩ませているようには見えません。

誰かが助けてくれることを願っています。

4

1 に答える 1

3

Magic s の代わりにDateTimeandを使用することをお勧めします。コードが読みやすくなり、実際には日付を正しく表示するのがかなり難しいため、自分で行うのではなく、ライブラリを使用することをお勧めします。次に、サイクル開始日から目標日を差し引いて、そのプロパティを取得できます。enumintDaysTimeSpan

static Working[] DaysArray = { Working.Off, Working.Off, Working.Off, Working.Off, Working.Off, Working.Off, Working.Off, Working.Nights, Working.Nights, Working.Nights, Working.Nights, Working.Off, Working.Off, Working.Off, Working.Days, Working.Days, Working.Days, Working.Off, Working.Nights, Working.Nights, Working.Nights, Working.Off, Working.Off, Working.Off, Working.Days, Working.Days, Working.Days, Working.Days };
public enum Working
{
    Off,
    Days,
    Nights,
}
public Working GetDayNightOff(DateTime cycleStart, DateTime day)
{
    var days = (day - cycleStart).Days;
    days %= DaysArray.Length;
    if (days < 0)
        days += DaysArray.Length;
    return DaysArray[days];
}

の計算ではdaysdayから遠く離れていcycleStartます。

于 2013-11-05T15:30:17.750 に答える