从烘烤器的开始日期开始计算非固定天数循环

时间:2018-06-25 21:01:58

标签: c# sql asp.net

作为我的员工项目的一部分,我为员工/工作班次制定了时间表。我想知道如果我正在像这样的非固定工作日模式下检查今天状态(工作或休息日)的最佳方法是什么:假设烘烤器的开始日期是2018年1月1日,模式是:第一天是上午班次(1月1日:从早上6点至14 pm),然后第二天是下午班次(1月2日:从14 pm到10 pm),然后是第三天晚上重叠班次(1月3日:10 pm到1月4日上午10点)然后是第四天和第五天(1月4日和1月5日)休息,然后从1月6日开始,作为早上的上班时间,以此类推。如您所见,它与星期几(通常)无关,所以我的变量是开始日期和模式。最好的方法是什么?

3 个答案:

答案 0 :(得分:2)

这是一个示例函数,用于计算日期的状态:

Dockerfile

答案 1 :(得分:1)

仅出于完成目的,我想提供以下基于类的方法:

public class Program
{
    static void Main(string[] args)
    {
        var shiftScheduler = new ShiftScheduler(new DateTime(2018, 01, 01));
        var requestedShift = shiftScheduler.GetShift(new DateTime(2018, 01, 05));

        Console.WriteLine(requestedShift.IsWorkDay
          ? $"Scheduled from ${requestedShift.HoursBegin}{requestedShift.MinutesBegin:00} " +
            $"to {requestedShift.HoursEnd}{requestedShift.MinutesEnd:00}"
          : "No work today");
    }

}

public class Shift
{
    public Shift(int hoursBegin, int hoursEnd, int minutesBegin, int minutesEnd, bool isWorkDay)
    {
        HoursBegin = hoursBegin;
        HoursEnd = hoursEnd;
        MinutesBegin = minutesBegin;
        MinutesEnd = minutesEnd;
        IsWorkDay = isWorkDay;
    }

    public int HoursBegin { get; set; }
    public int HoursEnd { get; set; }
    public int MinutesBegin { get; set; }
    public int MinutesEnd { get; set; }
    public bool IsWorkDay { get; set; }
}

public class ShiftScheduler
{
    private readonly Dictionary<int, Shift> _shifts = new Dictionary<int, Shift>();
    private readonly DateTime _startDate;

    public ShiftScheduler(DateTime startDate)
    {
        Initialize();
        _startDate = startDate;
    }

    private void Initialize()
    {
        _shifts.Add(0, new Shift(6, 14, 0, 0, true)); // Day 1
        _shifts.Add(1, new Shift(14, 22, 0, 0, true)); // Day 2
        _shifts.Add(2, new Shift(22, 6, 0, 0, true)); // Day 3
        _shifts.Add(3, new Shift(0, 0, 0, 0, false)); // Day 4, day off
        _shifts.Add(4, new Shift(0, 0, 0, 0, false)); // Day 5, day off
    }

    public Shift GetShift(DateTime targetDate)
    {
        int days = (int)Math.Floor((targetDate - _startDate).TotalDays);
        if (days < 0)
        {
            throw new ArgumentException("Target date prior to start date.");
        }

        Shift targetShift;
        _shifts.TryGetValue(days % _shifts.Count, out targetShift);
        return targetShift;
    }
}

答案 2 :(得分:0)

如何: ps:如果您不喜欢在构造函数中设置IsOff标志,则应将其设置为Date属性的setMethod

public Class WorkDay
{
    public DateTime Date { get; set; }
    public ShiftType ShiftType { get; set; }
    public bool IsOff { get; set;}
    public string HolidayName { get; set; }

    public WorkDay(DateTime date)
    {
          Date = date;
          if (date.DayOfWeek = DayOfWeek.Saturday || date.DayOfWeek = DayOfWeek.Sunday )
          IsOff = true;
    } 
}



enum ShiftType 
{
   Morning, Mid , Night
}