无法计算出例程来计算在日历上显示日期的时间表 - 算法

时间:2013-11-05 14:58:54

标签: c# algorithm calendar

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

时间表如下: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];
}

如果周期的第一天落在第一天,那么我想用索引0显示起始颜色;第二名:指数27;第3名:索引26等。我知道有一个简单的解决方案,但我似乎无法理解它。

希望有人能提供帮助,我们将不胜感激。

1 个答案:

答案 0 :(得分:3)

我建议您使用DateTimeenum代替魔术int。代码将更容易阅读,并且由于日期实际上是pretty hard to get right,因此最好使用库而不是自己执行。然后,您可以从周期开始日减去目标日期,并获得TimeSpan的{​​{3}}属性。

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