我想绑定正确的工作时间来纠正工作时间 . 工作周是从周一到周日 . 根据当天的时间,工作有不同的价格 . 基于完成当天时间的工作价格称为期间 . 我们使用24小时时间格式 .
例:
-
期间1:周一至周五,00:00至07:00
-
期间2:周一至周五,07:00-20:00
-
期间3:周一至周五,20:00-22:00
-
期间4:周一至周五,22:00-23:59(午夜)
-
期间5:周六 - 周日,00:00 - 07:00
-
期间6:周六 - 周日,07:00-22:00
-
期间7:周六 - 周日,22:00-23:59(午夜)
-
期间8:假日,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; }
}
Days是int,但值将来自此枚举:
[Flags]
public enum Workweek
{
Sunday = 1,
Monday = 2,
Tuesday = 4,
Wednesday = 8,
Thursday = 16,
Friday = 32,
Saturday = 64
}
当Period Days
属性为 62
时,表示期间从星期一到星期五有效,当天为: 65
期间为星期六至星期日 . 当天数为: 6
时,周期为周一至周二 .
Holiday
为true时表示Period仅在假日有效 . 假日覆盖正常的一天或周末 .
工作班次如下所示:
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之间,那么工作班次将是这样的:
-
期间2:5小时
-
期间3:2小时
-
期间4:1小时
案例1.1:如果特定星期一是假日,那么它将是:
- 期间8:8小时
案例2:如果相反,工作开始于星期一:20:00,第二天04:00结束,结果将是:
-
期间3:2小时
-
期间4:2小时
-
期间1:4小时
案例2.2:如果那个星期一是假期,它将是:
-
期间8:4小时
-
期间1:4小时
假期日是 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)
{
}
}
}
2 回答
工作范例:
.net fiddle
生成输出
尝试这样的事情 . 我不知道为什么你需要一个自定义的工作周,当你可以使用标准的DayOfWeek . 无论如何,我跟着你的请求 .