Сначала сохраните свое время в TimeSpan
. Это даст вам больше гибкости, если завтрашняя смена начинается и заканчивается в 30 минут. Затем сохраните эти Timespan
в классе, представляющем временные рамки. И если у вас есть список из них, сделайте список. Это поможет читать и поддерживать ваш код. На данный момент это набор магических чисел.
Чтобы проверить, находится ли время в диапазоне, я использовал:
public static bool IsBetween(TimeSpan time, TimeSpan start, TimeSpan end)
=> (start <= end) ? time >= start && time <= end : time >= start || time <= end;
internal void TestMethod()
{
var timeSlots = new[] {
new TimeFrame { start= new TimeSpan(6,0,0) , end = new TimeSpan(13,0,0) },
new TimeFrame { start= new TimeSpan(14,0,0) , end = new TimeSpan(21,0,0) },
new TimeFrame { start= new TimeSpan(22,0,0) , end = new TimeSpan(6,0,0) }
};
var today = DateTime.Today;
var dayHours = Enumerable.Range(0, 24).Select(x => today.AddHours(x)).ToList();
foreach (var currentDateTime in dayHours)
{
var matchingRanges = timeSlots.Where(x => IsBetween(currentDateTime .TimeOfDay, x.start, x.end));
if (matchingRanges.Any())
{
var temp = matchingRanges.First();
Console.WriteLine($"-> {currentDateTime } is in range {temp.start}-{temp.end}");
Console.WriteLine($"\t ShiftHours= {temp.start}-{temp.end.Subtract(new TimeSpan(0, 0, 1))}");
}
else
{
Console.WriteLine($"no Match for {currentDateTime }");
}
}
}
Поскольку вы добавили комментарий о его тестировании в полночь, включили TestMethod, в котором я создаю все часы дня (с 00 до 23 часов), чтобы вы могли легко видеть, что происходит.