Как проверить, находится ли текущее время между временными рамками?

У меня есть служба, которую пользователь может настроить для запуска во время "вне пиковых" часов. Они имеют возможность устанавливать временные рамки, которые служба может выполнять.

Пример:

Пользователь A работает с 8 до 17 часов, поэтому они хотят запланировать запуск приложения с 17:30 до 7:30.

Пользователь B работает с 9 pm-6am, поэтому они планируют, что приложение будет работать с 6:30 до 20:30.

Дело в том, что приложение использует свой компьютер, пока это не так.

Учитывая DateTime текущего времени, DateTime начала и DateTime времени остановки, как я могу проверить, находится ли ток между запуском и остановкой.

Сложная часть для меня заключается в том, что время может пересекать границу полуночи.

Ответ 1

Если startTime и endTime представляют один временной интервал (это произойдет только один раз, а startTime и endTime представляют дату и время начала/остановки), то это так же просто, как сказать

bool isTimeBetween = someTime >= startTime && someTime <= endTime;

Если это повторяющееся событие (происходит каждый день, в течение некоторого интервала), вы можете выполнять сравнения, используя свойство TimeOfDay. (Повторяющийся случай - это тот, где вы должны рассмотреть старт/стоп, который пересекает полночь)

static public bool IsTimeOfDayBetween(DateTime time, 
                                      TimeSpan startTime, TimeSpan endTime)
{
    if (endTime == startTime)
    {
        return true;   
    }
    else if (endTime < startTime)
    {
        return time.TimeOfDay <= endTime ||
            time.TimeOfDay >= startTime;
    }
    else
    {
        return time.TimeOfDay >= startTime &&
            time.TimeOfDay <= endTime;
    }

}

(Примечание: этот код предполагает, что если start == end, то он охватывает все времена. Вы сделали комментарий к этому вопросу в другом сообщении)

Например, чтобы проверить, работает ли оно между 5:00 и 9:30 вечера

IsTimeOfDayBetween(someTime, new TimeSpan(5, 0, 0), new TimeSpan(21, 30, 0))

Если startTime и endTime - DateTime s, вы можете сказать

IsTimeOfDayBetween(someTime, startTime.TimeOfDay, endTime.TimeOfDay)

Ответ 2

Поэтому я предполагаю из вопроса, который вы хотите узнать, если задано время начала и окончания для дня (не включая фактическую дату, то есть 1/1/1900 или что-то в этом роде), чтобы увидеть, с указанием времени, начинающегося и заканчивающегося. Например, если начало составляет 9 вечера, а конец - 9 утра, принимайте 10 вечера, но отклоняйте 10 утра.

Вы можете сделать это либо для типов временного диапазона (время равно, конец - после начала, конец - перед запуском), что просто:

if (end==start) return true
else if (end>start) return start<=time && time<=end
else return !(time>end && time<start)

Или вы можете расширить диапазон начала и конца таким образом, чтобы конец всегда начинался как таковой:

if (end<=start) end += <24 hours>
if (time<start) time+= <24 hours>
return time<=end

Ответ 3

Я предполагаю, что вы сохраняете время начала и окончания файла конфигурации приложений, поэтому все, что вам в основном нужно сделать, - это установить приложение на "on" при появлении "времени начала" и установить его на "off", когда происходит время остановки.

Таким образом, вам не нужно постоянно проверять, находится ли "сейчас" между временем начала и конца.

Ответ 4

if (current >= start & current <= stop)

(или без =)

Я думаю, что это все, что вам нужно?

полуночная граница - красная сельдь - все, что вам нужно знать, - это статус обоих сравнений.

Если вы делаете такие вещи, как выходные дни по-разному, тогда у вас есть другая логика, но базовое сравнение просто.

Ответ 5

DateTime t1;
t1 = DateTime.Now;

// loop inbetween start and end time      

if (t1>=start_time &&t1<=end_time) 

{
   //your code / action
}

//if you are using sql to get values 

start_time = Convert.ToDateTime(row.Cells[10].Text);
end_time = Convert.ToDateTime(row.Cells[11].Text);
//convert them to string or you will get some error!!!