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

Използване на .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 до 1: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 казах времеви интервал - person Sam I am says Reinstate Monica; 19.02.2016
comment
Отговорът по-долу трябва да е приетият... Този не проверява за TimeSpans през дни, напр. от 22: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 до 1: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 свойството връща 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.

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