我想将正确的小时数绑定到正确的工作时间段。工作周从周一到周日。根据当天的工作时间不同的价格。根据当天的时间完成的工作价格称为期间。我们使用24小时时间格式。根据工作日和小时+假日添加工作时间以更正价格类别
实施例:
- PERIOD1:周一 - 周五,00:00 - 07:00
- PERIOD2:周一 - 周五,07:00 - 20:00
- Period3:周一 - 周五, 20:00 - 22:00
- Period4:周一 - 周五,22:00 - 23:59(午夜)
- Period5:星期六 - 星期日,00:00 - 07:00
- Period6:星期六 - 太阳,07:00 - 22:00
- Period7:星期六 - 星期日,22:00 - 23:59(午夜)
- Period8:假日00:00 - 23:59
周期是这样表示:
public class Period
{
public Period()
{
}
public string Name { get; set; }
public int Days { get; set; }
public bool Holiday { get; set; }
public TimeSpan Start { get; set; }
public TimeSpan End { get; set; }
}
天为int,但值将来自该枚举:
[Flags]
public enum Workweek
{
Sunday = 1,
Monday = 2,
Tuesday = 4,
Wednesday = 8,
Thursday = 16,
Friday = 32,
Saturday = 64
}
当周期Days
属性为62
这意味着I期有效期为星期一至星期五,星期几为:65
期间为星期六至星期日。当Days是:6
期间是从星期一到星期二。
当Holiday
为真时表示该期间仅在休假日有效。节假日覆盖正常的一天或周末。
工作班次是这样表示:
public class Work
{
public Work()
{
}
public string Name { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
}
假设我有一个List<Work>
和List<Period>
我如何可以将绑定在工作时间以正确的期间?每个期间都有不同的定价。
例子:
案例1:如果你之间在周一工作班次:15:00和23:00,那么工作班次将是这样的:
- PERIOD2:5小时
- Period3:2小时
- Period4:1小时
情况1。1:如果特定的星期一,节日,那么这将是:
- Period8 8小时
案例2:如果不是工作在周一开始于20:00,结束于04: 00第二天结果将是:
- Period3:1小时
- Period4:1小时
- PERIOD1:四小时
案例2.2:如果星期一是假日,这将是:
- Period8:四小时
- PERIOD1:四小时
假期日子如List<DateTime>
。
我怎样才能匹配正确的时间段?
我试过到目前为止:
Work work = new Work()
{
Name = Demo,
Star = new DateTime(2017,05,02,15,00,00);
End = new DateTime(2017,05,02,23,00,00);
};
List<Period> periods = new List<Period>();
foreach (var period in periods)
{
Workweek shiftDay = (Workweek)Enum.Parse(typeof(Workweek), work.Start.DayOfWeek, true); // i think this is wrong, because in the case where the end date is in the next day
Workweek periodDay = (Workweek)period.Days;
if ((shiftDay & periodDay) == shiftDay)
{
// the work matches the period
}
}
我想我应该使用foreach循环,并通过每个第二起始日期和结束日期之间,并检查如果第二期天相匹配。
事情是这样的:
public static IEnumerable<DateTime> EachSecond(this Work work)
{
DateTime currentSecond = new DateTime(work.Start.Year, work.Start.Month, work.Start.Day, work.Start.Hour, work.Start.Minute, work.Start.Second, work.Start.Millisecond);
while (currentSecond <= wor.kEnd)
{
yield return currentSecond;
currentSecond = currentSecond.AddSeconds(1);
}
}
Work work = new Work()
{
Name = Demo,
Star = new DateTime(2017,05,02,15,00,00);
End = new DateTime(2017,05,02,23,00,00);
};
List<Period> periods = new List<Period>();
foreach (var second in work.EachSecond())
{
Workweek shiftSecond = (Workweek)Enum.Parse(typeof(Workweek), second.DayOfWeek, true);
foreach (var period in periods)
{
Workweek periodDay = (Workweek)period.Days;
if ((shiftSecond & periodDay) == shiftSecond)
{
}
}
}
你需要显示至少一些试图解决这个问题,计算器不是代码编写售后服务所有。 – Evk
@Evk:更新了问题 – user2818430
我认为这个方法并不是太过于简单。从我的头顶我看到两件事:1.你真的需要重复几秒钟?这段时间是基于分钟的,所以我也会在匹配过程中使用分钟。 2.您也可以查看[DateTime.CompareTo](https://msdn.microsoft.com/de-de/library/system.datetime.compare(v = vs.110).aspx),然后使用保存持续时间在这两者之间可以节省循环,但可能需要更多的代码。目前我无法生成示例:/ –