Sprawdź, czy bieżący czas mieści się w przedziale czasu


147

Korzystanie z .NET 3.5

Chcę ustalić, czy bieżący czas mieści się w przedziale czasu.

Póki co mam aktualny czas:

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

Nie wiem, jak przekonwertować i porównać zakres czasu. Czy to zadziała?

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

UPDATE1: Dziękuję wszystkim za sugestie. Nie znałem funkcji TimeSpan.



3
Czy musisz się martwić przekroczeniem północy?
gjutras

1
przekroczenie północy nie jest problemem, ale wszystko, co obejmuje północ, jest z pewnością zmorą mojego doświadczenia programistycznego ...
John M

Odpowiedzi:


258

Aby sprawdzić porę dnia:

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
}

Dla czasów bezwzględnych użyj:

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
}

Jak policzyć liczbę dopasowań? Na przykład chcę policzyć, ile sobót i niedziel mieści się w zakresie.
pbies

@pmbiesiada: To jest całkowicie poza zakresem pierwotnego pytania (i odpowiedzi). Powinieneś uczynić to nowe pytanie, ale poszukaj tutaj na SO, jeśli na coś takiego odpowiedziałeś wcześniej. Powodzenia.
Frank Bollack,

1
A jeśli w różne dni są różne godziny? Czy łatwo to porównać? stackoverflow.com/questions/22769557/…
SearchForKnowledge

@SearchForKnowledge: Porównanie czego? Podaj bardziej szczegółowe informacje na temat tego, co chcesz osiągnąć, lub podaj kilka przykładów.
Frank Bollack

4
Odpowiedź poniżej powinna być akceptowana ... Ta nie sprawdza TimeSpans w dniach, np. Od 22:00:00 do 02:00:00 ...
FranzHuber 23

117

Kilka dobrych odpowiedzi tutaj, ale żadna nie obejmuje przypadku, gdy godzina rozpoczęcia przypada w innym dniu niż godzina zakończenia. Jeśli chcesz przekroczyć granicę dnia, może pomóc coś takiego:

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

Zwróć uwagę, że w tym przykładzie granice czasu są włącznie i nadal zakłada się, że różnica między starta wynosi mniej niż 24 godziny stop.


1
A jeśli w różne dni są różne godziny? Czy łatwo to porównać? stackoverflow.com/questions/22769557/…
SearchForKnowledge

Słuszna uwaga, to ma sens. Gdyby odmierzony czas upłynął do północy, byłaby to jedyna odpowiedź, która nadal byłaby poprawna.
Sunsetquest

1
dziękuję, po godzinach próbowałem 11:57 pmi to zadziałało: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut

1
Dziękuję za to. Odpowiedź wydaje się prosta, ale konceptualizacja jest trochę niezręczna.
Sam jestem mówi Przywróć Monikę

To świetna odpowiedź. Piszę sposób na ustalenie, czy dany czas DateTimemieści się w określonych godzinach pracy. Godziny pracy mogą przypadać tego samego dnia, ale mogą również obejmować dwa dni (np. 15:00 - 1:00 godziny pracy).
Drew

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

jeśli naprawdę chcesz przeanalizować ciąg w TimeSpan, możesz użyć:

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

dziękuję, po godzinach próbowałem 11:57 pmi to zadziałało: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut

16

Prosta funkcja rozszerzenia do tego:

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
Dobry dodatek Andre. Nie pomyślałbym, żeby zrobić porównanie OR dla przypadku innego dnia.
David

3
Świetny mały fragment kodu, ale jeden problem. A co, jeśli określisz ten sam czas rozpoczęcia i zakończenia. Jedno założenie jest takie, że może to oznaczać, że powinno obejmować okres 24 godzin, co oznacza, że ​​twój stan, na który start <= endnależy zmienić kontrole, start < enda innym założeniem może być to, że jest to tego samego dnia, ale jeśli tak jest, prawdopodobnie zakończy się niepowodzeniem, jeśli używasz Now.TimeOfDay, ponieważ obejmuje milisekundy i powoduje, że jest poza zakresem.
Thierry

@Thierry Niezły chwyt :) Zapraszamy do wypróbowania tego rozwiązania.
André Snede Kock

14

Spróbuj użyć obiektu TimeRange w C #, aby osiągnąć swój cel.

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

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

Oto, gdzie mam ten przykład użycia TimeRange


12
TimeRange nie jest klasą z żadnej biblioteki C #. Jest to klasa zewnętrzna, którą można pobrać pod powyższym linkiem.
Jpsy,

6

TimeOfDayWłasność zwraca TimeSpanwartość.

Wypróbuj następujący kod:

TimeSpan time = DateTime.Now.TimeOfDay;

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

Ponadto new DateTime()jest taki sam jak DateTime.MinValuei zawsze będzie równy 1/1/0001 12:00:00 AM. (Typy wartości nie mogą mieć niepustych wartości domyślnych), którego chcesz użyć DateTime.Now.


2

Jesteś bardzo blisko, problem polega na tym, że porównujesz DateTime z TimeOfDay. To, co musisz zrobić, to dodać właściwość .TimeOfDay na końcu funkcji Convert.ToDateTime ().


2

Czy będzie to prostsze do obsługi przypadku granicy dnia? :)

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

Używając Linqa możemy to uprościć w ten sposób

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

    }
 }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.