我想將正確的小時數綁定到正確的工作時間段。工作周從週一到週日。根據當天的工作時間不同的價格。根據當天的時間完成的工作價格稱爲期間。我們使用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),然後使用保存持續時間在這兩者之間可以節省循環,但可能需要更多的代碼。目前我無法生成示例:/ –