Как проверить что рабочая смена закончилась, паттерн State

Реализую паттерн State, и не получается реализовать переход из состояния working в work end. Есть следующая сущность, которая определяет текущую смену (их две пока что: с 8:00 до 20:00, с 20:00 до 8:00). Проблема в том, что ночная смена начинается (условно) 15 числа, а заканчивается утром 16 числа, но дневная смена начинается 15 и заканчивается 15 числа

Структура определяет начало и конец рабочего дня, а метод GetWorkingTime возвращает более конкретное значение (например для start: 07.10.2022 8:00:00, end: 07.10.2022 20:00:00)

public readonly struct Work
{
    public Work(TimeSpan start, TimeSpan end)
    {
        WorkStart = start;
        WorkEnd = end;
    }
    public TimeSpan WorkStart { get; }
    public TimeSpan WorkEnd { get; }

    public (DateTime, DateTime) GetWorkingTime(DateTime date)
    {
        var start = date.Date.Add(WorkStart);
        DateTime endDate;

        //Проверка является ли текущая смена "ночной" и если является, 
        //то конец рабочего дня будет утром следующего дня.
        if (WorkStart > WorkEnd && WorkStart > date.TimeOfDay)
        {
            endDate = date.Date.Add(WorkEnd).AddDays(1);
        }
        else
        {
            endDate = date.Date.Add(WorkEnd);
        }
        return (start, endDate);
    }
}

Метод Next в WorkingState работает для ночной смены (с 20:00 до 8:00), но не работает для дневной смены (с 8:00 до 20:00) и я не знаю как правильно сделать условие чтобы оно корректно работало для любой смены.

class WorkingState : StateBase 
{
    public override void Next()
    {
        StateBase next = this;
        
        //Текущее реальное состояние которое должно определить состояние next
        var lastDate = Context.GetLastItemDate();
        var workDates = Context.CurrentWorkshift.Work.GetWorkingTime(lastDate);

        //workDates.Item1 - дата и время НАЧАЛА текущей смены
        //workDates.Item2 - дата и время КОНЦА текущей смены
        if ((lastDate.TimeOfDay >= workDates.Item2.TimeOfDay && lastDate.TimeOfDay <= workDates.Item1.TimeOfDay) ||
            (lastDate >= workDates.Item2 && lastDate <= workDates.Item1))
        {
            nextState = new WorkEndState(Context);
        }
    }

}

Ответы (0 шт):