我有一個問題處理日期時間段,當一天在不同時段開始的班次劃分。我正在尋求解決這個在c#如何處理不同時段一天開始的時段?
例1: 我有一個事件,從20150901 06:00到20150902 03:00。我的工作班次是D(06:00至18:00)和N(18:00至06:00)。我想將事件分配給班次日期時間值。
START DATETIME END DATETIME
20150901 0600 20150902 0300
SHIFT START END
D 0600 1800
N 1800 0600
,我應該得到的時隙是:
DATE SHIFT STARTTIME ENDTIME
20150901 D 0600 1800
20150901 N 1800 0300
例2: 當天在四個換檔分,但在當天06:00(01開頭:0600-1200,02 :1200-1800,03:1800-2400,04:0000-0600)。本次活動由20150901上午08:00去20150903 10:00
START DATETIME END DATETIME
20150901 0800 20150903 1000
SHIFT START END
01 0600 1159
02 1200 1759
03 1800 2359
04 0000 0559
的時隙我應該得到的是:
DATE SHIFT STARTTIME ENDTIME
20150901 01 0800 1200
20150901 02 1200 1800
20150901 03 1800 0000
20150901 04 0000 0600
20150902 01 0600 1200
20150902 02 1200 1800
20150902 03 1800 0000
20150902 04 0000 0600
20150903 01 0600 1000
例3: 當天在四個換檔分,但一天從06:00開始(01:0600-1200,02:1200-1800,03:1800-2400,04:0000-0600)。本次活動由20150901上午02點去20150902 10:00
START DATETIME END DATETIME
20150901 0200 20150902 1000
SHIFT START END
01 0600 1159
02 1200 1759
03 1800 2359
04 0000 0559
的時隙我應該得到的是:
DATE SHIFT STARTTIME ENDTIME
20150831 04 0200 0600
20150901 01 0800 1200
20150901 02 1200 1800
20150901 03 1800 0000
20150901 04 0000 0600
20150902 01 0600 1000
編輯1:補充一點,我的源代碼。
編輯2:添加例如3和糾正由馬特·約翰遜提出了一些點
的代碼適用於某些情況下,但我仍然有錯誤時,該事件是某種轉變邊界之外(活動開始例如第一次輪班之前)。
public class slot
{
public DateTime date;
public TimeSpan startHour;
public TimeSpan endHour;
public string shiftCode;
}
public List<slot> getSlots()
{
slot[] shifts = new slot[4];
shifts[0] = new slot();
shifts[0].startHour = new TimeSpan(06, 00, 00);
shifts[0].endHour = new TimeSpan(12, 00, 00);
shifts[0].shiftCode = "01";
shifts[1] = new slot();
shifts[1].startHour = new TimeSpan(12, 00, 00);
shifts[1].endHour = new TimeSpan(18, 00, 00);
shifts[1].shiftCode = "02";
shifts[2] = new slot();
shifts[2].startHour = new TimeSpan(18, 00, 00);
shifts[2].endHour = new TimeSpan(00, 00, 00);
shifts[2].shiftCode = "03";
shifts[3] = new slot();
shifts[3].startHour = new TimeSpan(00, 00, 00);
shifts[3].endHour = new TimeSpan(06, 00, 00);
shifts[3].shiftCode = "04";
DateTime startEvent = new DateTime(2015, 09, 01, 08, 00, 00);
DateTime endEvent = new DateTime(2015, 09, 03, 10, 00, 00);
int i = 0;
//To find the starting shift for the event
while (!(
shifts[i].startHour <= shifts[i].endHour
? (startEvent.TimeOfDay >= shifts[i].startHour && startEvent.TimeOfDay < shifts[i].endHour)
: (startEvent.TimeOfDay >= shifts[i].startHour || startEvent.TimeOfDay < shifts[i].endHour)
))
i++;
DateTime slotStart = startEvent;
DateTime slotEnd = slotStart.Date + shifts[i].endHour;
List<slot> slotList = new List<slot>();
while(endEvent >= slotEnd)
{
slot newSlot = new slot();
newSlot.date = slotStart;
newSlot.startHour = slotStart.TimeOfDay;
newSlot.endHour = shifts[i].endHour;
newSlot.shiftCode = shifts[i].shiftCode;
slotList.Add(newSlot);
i++;
if (i >= shifts.Length)
i = 0;
if (shifts[i].startHour < newSlot.endHour)
slotStart = slotStart.Date.AddDays(1);
slotEnd = slotStart.Date + shifts[i].endHour;
slotStart = slotStart.Date + shifts[i].startHour;
}
slot lastSlot = new slot();
lastSlot.date = slotStart;
lastSlot.startHour = slotStart.TimeOfDay;
lastSlot.endHour = endEvent.TimeOfDay;
lastSlot.shiftCode = shifts[i].shiftCode;
slotList.Add(lastSlot);
return slotList;
}
你有沒有嘗試過任何東西?我們可以提供指導但不完整的解決方案。 – jjczopek
對不起,我忘了添加它。這是迄今爲止我得到的。我想知道是否有更簡單/更好的方法可以解決前沿問題。 –