Как проверить, находится ли текущее время между временными рамками?
У меня есть служба, которую пользователь может настроить для запуска во время "вне пиковых" часов. Они имеют возможность устанавливать временные рамки, которые служба может выполнять.
Пример:
Пользователь 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!!!