C# Матч сдвиг, который охватывает более полуночи
У меня есть следующее netfiddle:
Как я могу заставить это работать, добавляя период, который охватывает полночь как это:
`new Period( "9", Days.Workdays, TimeSpan.FromHours(22), TimeSpan.FromHours(07) )`
Уведомление с 22:00 (22:00) до 07:00 (07:00)
2 ответа
Мэтт имеет правильный ответ выше, но пара изменений:
Во-первых, вам нужно убедиться, что у вас есть скобки (отсюда и проблема с памятью):
var period = _periods.Where(e => e.Days.HasFlag(day) && (e.Start <= e.End ? (e.Start <= timeOfDay && e.End > timeOfDay) : (e.Start <= timeOfDay || e.End > timeOfDay))).FirstOrDefault();
Во-вторых, в вашем методе GetShiftPeriods вам нужно смещаться на день (просто добавив период. Конец не будет работать в этом сценарии, потому что это будет просто "7 часов" вместо 7 часов утра).
var next = current.Date + period.End;
if (period.End < period.Start)
{
next = next.AddDays(1);
}
Наконец, у вас есть некоторые совпадения в ваших периодах, которые вы определили. Это прекрасно работает для меня, когда я удаляю период № 4 (комментарий) с двумя изменениями выше. Не уверен, что вы намеревались перекрываться, но если вы это сделаете - этот период будет проигнорирован.
Предполагая, что ваш вопрос касается этой части вашего кода:
e.Start <= timeOfDay && e.End > timeOfDay
Вы можете изменить это на следующее, чтобы учесть интервалы времени в течение полуночи:
e.Start <= e.End // Are times in sequence?
? (e.Start <= timeOfDay && e.End > timeOfDay) // Yes - standard calculation (AND)
: (e.Start <= timeOfDay || e.End > timeOfDay) // No - inverse calculation (OR)