C# Матч сдвиг, который охватывает более полуночи

У меня есть следующее netfiddle:

.net fiddle

Как я могу заставить это работать, добавляя период, который охватывает полночь как это:

`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)
Другие вопросы по тегам