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

147

Использование .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.

Джон М
источник
Дубликат: stackoverflow.com/questions/1408165/…
Альфред Майерс
3
Вам нужно беспокоиться о пересечении полуночи?
Гютра
1
переход через полночь не вызывает беспокойства, но все, что охватывает полночь, наверняка станет проклятием моего опыта программирования ...
Джон М

Ответы:

258

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

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
}
Фрэнк Боллак
источник
Как посчитать количество совпадений? Например, я хочу посчитать, сколько суббот и воскресений в диапазоне.
pbies
@pmbiesiada: Это полностью выходит за рамки оригинального вопроса (и ответа). Вы должны сделать это новым вопросом, но сделайте поиск здесь на SO, если на что-то подобное уже был дан ответ. Удачи.
Фрэнк Боллак
1
Что если разное время для разных дней? Легко ли это сравнить? stackoverflow.com/questions/22769557/…
SearchForKnowledge
@SearchForKnowledge: сравнить для чего? Пожалуйста, будьте более конкретны в отношении того, чего вы хотите достичь, или приведите несколько примеров.
Фрэнк Боллак
4
Ответ ниже должен быть принятым ... Этот не проверяет наличие TimeSpans в течение нескольких дней, например, с 22:00:00 до 02:00:00 ...
FranzHuber23
118

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

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.

Ник
источник
1
Что если разное время для разных дней? Легко ли это сравнить? stackoverflow.com/questions/22769557/…
SearchForKnowledge
Хорошая мысль, в этом есть смысл. Если измеренное время пройдет через полночь, то это будет единственный ответ, который все еще будет правильным.
Sunsetquest
1
спасибо, после нескольких часов я пытался, 11:57 pmи это сработало: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
Shaijut
1
Спасибо вам за это. Ответ кажется простым, но осмысливать его довольно неудобно.
Сэм, я говорю, восстанови Монику
Это отличный ответ. Я пишу метод, чтобы определить, DateTimeпопадает ли время данного заданного в указанные рабочие часы. Рабочие часы могут быть в один и тот же день, но они также могут занимать два дня (например, 15:00 - 1:00 часов работы).
Дрю
17
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");
JDunkerley
источник
спасибо, после нескольких часов я пытался, 11:57 pmи это сработало: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
Shaijut
16

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

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;
}
Андре Снед Кок
источник
3
Хорошее дополнение Андре. Не подумал бы сделать сравнение ИЛИ для случая другого дня.
Дэвид
3
Отличный маленький кусочек кода, но одна проблема с ним. Что делать, если вы указываете одинаковое время начала и окончания. Одно из предположений состоит в том, что это может означать, что оно должно охватывать 24-часовой период, что означает, что ваше состояние start <= endдолжно быть изменено, start < endи другое предположение может заключаться в том, что оно выполняется в тот же день, но если это так, то оно, скорее всего, не выполнится вы используете Now.TimeOfDay, так как он включает миллисекунды и приводит к выходу за пределы диапазона.
Тьерри
@Thierry Хороший улов :) Вы можете попробовать и исправить это.
Андре Снеде Коцк
14

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

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

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

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

stewsha
источник
12
TimeRange не является классом из любой библиотеки C #. Это внешний класс, который можно скачать по ссылке выше.
Jpsy
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.

SLaks
источник
2

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

Майкл Ла Вой
источник
2

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

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 ... 
}
Elliott
источник
0

Используя 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))
Эду Сиело
источник
0
 using System;

 public class Program
 {
    public static void Main()
    {
        TimeSpan t=new TimeSpan(20,00,00);//Time to check

        TimeSpan start = new TimeSpan(20, 0, 0); //8 o'clock evening

        TimeSpan end = new TimeSpan(08, 0, 0); //8 o'clock Morning

        if ((start>=end && (t<end ||t>=start))||(start<end && (t>=start && t<end)))
        {
           Console.WriteLine("Mached");
        }
        else
        {
            Console.WriteLine("Not Mached");
        }

    }
 }
Патель Вишал
источник