Определите, падает ли текущее время во временном интервале

Использование .NET 3.5

Я хочу определить, падает ли текущее время во временном диапазоне.

Пока у меня есть текущее время:

DateTime currentTime = new DateTime();
currentTime.TimeOfDay;

Я забываю, как преобразовать и сравнить временной диапазон. Будет ли это работать?

if (Convert.ToDateTime("11:59") <= currentTime.TimeOfDay 
    && Convert.ToDateTime("13:01") >= currentTime.TimeOfDay)
{
   //match found
}

UPDATE1: Спасибо всем за ваши предложения. Я не был знаком с функцией TimeSpan.

Ответ 1

Для проверки использования времени суток:

TimeSpan start = new TimeSpan(10, 0, 0); //10 o'clock
TimeSpan end = new TimeSpan(12, 0, 0); //12 o'clock
TimeSpan now = DateTime.Now.TimeOfDay;

if ((now > start) && (now < end))
{
   //match found
}

Для абсолютных времен используйте:

DateTime start = new DateTime(2009, 12, 9, 10, 0, 0)); //10 o'clock
DateTime end = new DateTime(2009, 12, 10, 12, 0, 0)); //12 o'clock
DateTime now = DateTime.Now;

if ((now > start) && (now < end))
{
   //match found
}

Ответ 2

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

TimeSpan start = TimeSpan.Parse("22:00"); // 10 PM
TimeSpan end = TimeSpan.Parse("02:00");   // 2 AM
TimeSpan now = DateTime.Now.TimeOfDay;

if (start <= end)
{
    // start and stop times are in the same day
    if (now >= start && now <= end)
    {
        // current time is between start and stop
    }
}
else
{
    // start and stop times are in different days
    if (now >= start || now <= end)
    {
       // current time is between start and stop
    }
}

Обратите внимание, что в этом примере временные границы являются включительными и что это все еще предполагает менее чем 24-часовую разницу между start и stop.

Ответ 3

if (new TimeSpan(11,59,0) <= currentTime.TimeOfDay && new TimeSpan(13,01,0) >=  currentTime.TimeOfDay)
{
   //match found
}

если вы действительно хотите разобрать строку в TimeSpan, вы можете использовать:

    TimeSpan start = TimeSpan.Parse("11:59");
    TimeSpan end = TimeSpan.Parse("13:01");

Ответ 5

Простая небольшая функция расширения для этого:

public static bool IsBetween(this DateTime now, TimeSpan start, TimeSpan end)
{
    var time = now.TimeOfDay;
    // If the start time and the end time is in the same day.
    if (start <= end)
        return time >= start && time <= end;
    // The start time and end time is on different days.
    return time >= start || time <= end;
}

Ответ 6

TimeOfDay свойство возвращает TimeSpan.

Попробуйте использовать следующий код:

TimeSpan time = DateTime.Now.TimeOfDay;

if (time > new TimeSpan(11, 59, 00)        //Hours, Minutes, Seconds
 && time < new TimeSpan(13, 01, 00)) {
    //match found
}

Кроме того, new DateTime() совпадает с DateTime.MinValue и всегда будет равен 1/1/0001 12:00:00 AM. (Типы значений не могут иметь непустые значения по умолчанию). Вы хотите использовать DateTime.Now.

Ответ 7

Вы очень близки, проблема в том, что вы сравниваете DateTime с TimeOfDay. Что вам нужно сделать, так это добавить свойство .TimeOfDay в конец ваших функций Convert.ToDateTime().

Ответ 8

Используя Linq, мы можем упростить это посредством

 Enumerable.Range(0, (int)(to - from).TotalHours + 1)
            .Select(i => from.AddHours(i)).Where(date => date.TimeOfDay >= new TimeSpan(8, 0, 0) && date.TimeOfDay <= new TimeSpan(18, 0, 0))

Ответ 9

Будет ли это проще для обработки дневного граничного случая?:)

TimeSpan start = TimeSpan.Parse("22:00");  // 10 PM
TimeSpan end = TimeSpan.Parse("02:00");    // 2 AM
TimeSpan now = DateTime.Now.TimeOfDay;

bool bMatched = now.TimeOfDay >= start.TimeOfDay &&
                now.TimeOfDay < end.TimeOfDay;
// Handle the boundary case of switching the day across mid-night
if (end < start)
    bMatched = !bMatched;

if(bMatched)
{
    // match found, current time is between start and end
}
else
{
    // otherwise ... 
}