作为我的员工项目的一部分,我为员工/工作班次制定了时间表。我想知道如果我正在像这样的非固定工作日模式下检查今天状态(工作或休息日)的最佳方法是什么:假设烘烤器的开始日期是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日开始,作为早上的上班时间,以此类推。如您所见,它与星期几(通常)无关,所以我的变量是开始日期和模式。最好的方法是什么?
答案 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
}