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

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

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

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

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

Я не понимаю, как преобразовать и сравнить временной диапазон. Это сработает?

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

ОБНОВЛЕНИЕ 1: Спасибо всем за ваши предложения. Я не был знаком с функцией TimeSpan.


person John M    schedule 01.10.2009    source источник
comment
Дубликат: stackoverflow .com / questions / 1408165 /   -  person Alfred Myers    schedule 01.10.2009
comment
Тебе нужно беспокоиться о пересечении полуночи?   -  person gjutras    schedule 01.10.2009
comment
пересечение полуночи - не проблема, но все, что выходит за пределы полуночи, несомненно, отравляет мой опыт программирования ...   -  person John M    schedule 01.10.2009


Ответы (9)


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

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
}
person Frank Bollack    schedule 01.10.2009
comment
Как посчитать количество совпадений? Например, я хочу подсчитать, сколько суббот и воскресений находится в диапазоне. - person pbies; 04.09.2013
comment
@pmbiesiada: Это полностью выходит за рамки исходного вопроса (и ответа). Вы должны сделать это новый вопрос, но сделайте поиск здесь, на SO, если на что-то подобное уже был дан ответ раньше. Удачи. - person Frank Bollack; 05.09.2013
comment
Что делать, если в разные дни разное время? Это легко сравнить? stackoverflow .com / questions / 22769557 / - person SearchForKnowledge; 31.03.2014
comment
@SearchForKnowledge: Для чего сравнивать? Пожалуйста, уточните, чего вы хотите достичь, или приведите несколько примеров. - person Frank Bollack; 01.04.2014
comment
Я смог понять это с некоторой помощью. Спасибо :) Хотел сравнить текущее время с режимом работы. - person SearchForKnowledge; 01.04.2014
comment
@FrankBollack, как при этом фиксировать местное время? - person Sumedha Vangury; 14.10.2015
comment
Что, если ваше время идет с 23:00 до 01:00? - person Sam I am says Reinstate Monica; 18.02.2016
comment
@SamIam: Timespan - это просто относительное количество времени, то есть количество дней, часов или секунд. Он не знает, когда. В первом примере время дня сравнивается с использованием количества времени, прошедшего с начала дня: например, 10 часов означает 10 часов утра. - person Frank Bollack; 19.02.2016
comment
@FrankBollack Я не сказал Timespan Я сказал Time Span - person Sam I am says Reinstate Monica; 19.02.2016
comment
Ответ ниже должен быть принятым ... Этот не проверяет TimeSpans за несколько дней, например с 22:00:00 до 02:00:00 ... - person FranzHuber23; 08.11.2017

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

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.

person Nick    schedule 24.01.2014
comment
Что делать, если в разные дни разное время? Это легко сравнить? stackoverflow .com / questions / 22769557 / - person SearchForKnowledge; 31.03.2014
comment
Хорошая мысль, в этом есть смысл. Если измеренное время проходит через полночь, это будет единственный ответ, который все равно будет правильным. - person SunsetQuest; 06.03.2015
comment
спасибо, в нерабочее время я попробовал 11:57 pm, и это сработало: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time); - person Shaiju T; 01.09.2015
comment
Спасибо за это. Ответ кажется простым, но его сложно осмыслить. - person Sam I am says Reinstate Monica; 18.02.2016
comment
Это отличный ответ. Я пишу метод, чтобы определить, попадает ли время данного DateTime в указанные рабочие часы. Рабочие часы могут быть в один и тот же день, но они также могут охватывать два дня (например, с 15:00 до 13:00 рабочие часы). - person Drew; 20.01.2018

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");
person JDunkerley    schedule 01.10.2009
comment
спасибо, в нерабочее время я попробовал 11:57 pm, и это сработало: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time); - person Shaiju T; 01.09.2015

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

public static bool IsBetween(this DateTime now, TimeSpan start, TimeSpan end)
{
    var time = now.TimeOfDay;
    // Scenario 1: If the start time and the end time are in the same day.
    if (start <= end)
        return time >= start && time <= end;
    // Scenario 2: The start time and end time is on different days.
    return time >= start || time <= end;
}
person André Snede    schedule 11.11.2016
comment
Хорошее дополнение Андре. Не подумал бы сделать сравнение операционной для случая другого дня. - person David; 11.12.2016
comment
Отличный маленький фрагмент кода, но с ним одна проблема. Что, если вы укажете одинаковое время начала и окончания. Одно предположение состоит в том, что это может означать, что он должен охватывать 24-часовой период, что означает, что ваше условие, которое проверяет start <= end, должно быть изменено на start < end, и другое предположение может заключаться в том, что это происходит в тот же день, но если это так, это, вероятно, будет потерпеть неудачу, если вы используете Now.TimeOfDay, поскольку он включает миллисекунды и вызывает выход за пределы допустимого диапазона. - person Thierry; 06.03.2018
comment
@Thierry Хороший улов :) Вы можете попробовать и исправить это. - person André Snede; 06.03.2018

Попробуйте использовать объект TimeRange в C # для достижения своей цели.

TimeRange timeRange = new TimeRange();
timeRange = TimeRange.Parse("13:00-14:00");

bool IsNowInTheRange = timeRange.IsIn(DateTime.Now.TimeOfDay);
Console.Write(IsNowInTheRange);

Вот где я получил этот пример использования TimeRange

person stewsha    schedule 01.10.2009
comment
TimeRange не является классом какой-либо библиотеки C #. Это внешний класс, который можно скачать по ссылке выше. - person Jpsy; 19.01.2012

Свойство TimeOfDay возвращает _ 2_ value.

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

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.

person SLaks    schedule 01.10.2009

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

person Michael La Voie    schedule 01.10.2009

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

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 ... 
}
person Elliott    schedule 27.10.2016

Используя 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))
person Edu Cielo    schedule 27.07.2016