З'ясуйте, чи падає поточний час у діапазоні часу


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.



3
Вам потрібно перейматися переходом опівночі?
gjutras

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
}

Як порахувати кількість матчів? Наприклад, я хочу порахувати, скільки суботи та неділі знаходиться в діапазоні.
пібі

@pmbiesiada: Це повністю виходить за рамки оригінального питання (і відповіді). Ви повинні зробити це новим питанням, але зробіть серач тут, так, якщо щось подібне раніше було відповідено. Удачі.
Френк Боллак

1
Що робити, якщо для різних днів є різний час? Чи легко порівняти це? stackoverflow.com/questions/22769557/…
SearchForKnowledge

@SearchForKnowledge: Порівняйте для чого? Будь ласка, уточнюйте, що ви хочете досягти, або наведіть кілька прикладів.
Френк Боллак

4
Відповідь нижче повинна бути прийнятою ... Цей не перевіряється на TimeSpans протягом днів, наприклад, з 22:00 до 02:00:00 ...
FranzHuber23

117

Тут є кілька хороших відповідей, але жодна не стосується випадків, коли ваш початковий час перебуває в інший день, ніж ваш кінцевий час. Якщо вам потрібно відкласти межу дня, то щось подібне може допомогти:

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

Хороший момент, це має сенс. Якщо вимірюваний час проходить через півночі, то це була б єдина відповідь, яка все-таки буде правильною.
Захід сонця

1
дякую, через години я намагався, 11:57 pmі це спрацювало: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut

1
Дякую тобі за це. Відповідь здається простою, але її як би незручно концептуалізувати.
Сем, я кажу: Відновіть Моніку

Це чудова відповідь. Я пишу метод, щоб визначити, чи DateTimeпідпадає час заданої робочої години. Робочий час може бути в той же день, але вони також можуть тривати два дні (наприклад, 3:00 - 1 годину роботи).
Дрю

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");

дякую, через години я намагався, 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


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.


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 ... 
}

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");
        }

    }
 }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.