1

我正在做一个日历页面来显示轮班工作的白天、晚上和休息日。

日程安排是这样的:7 天休息,4 晚休息,3 天休息,1 天休息,3 晚休息,3 天休息,4 天,然后 28 天的循环重新开始。周期总是从星期五开始。

有 4 个不同的工作人员:每个工作人员一个星期后开始。

所以我有一个 sql 表,其中只有第一个工作人员 7 休息的前 28 天周期的月、日和年,我将其吸进一个集合并添加字段来计算其他工作人员的起始 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;第三:索引 26 等等。我知道有一个简单的解决方案,但我似乎无法理解它。

希望有人可以提供帮助,将不胜感激。

4

1 回答 1

3

我建议您使用DateTimeand anenum而不是 magic ints。代码会更容易阅读,而且由于日期实际上很难正确,所以最好使用库而不是自己做。然后你可以从周期开始日中减去你的目标日并得到那个的Days属性TimeSpan

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];
}

days允许的计算day远非cycleStart

于 2013-11-05T15:30:17.750 回答