Finden Sie heraus, ob die aktuelle Zeit in einen Zeitbereich fällt


146

Verwenden von .NET 3.5

Ich möchte feststellen, ob die aktuelle Zeit in einen Zeitbereich fällt.

Bisher habe ich die aktuelle Zeit:

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

Ich werde ausblenden, wie der Zeitbereich konvertiert und verglichen werden kann. Würde das funktionieren?

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

UPDATE1: Vielen Dank an alle für Ihre Vorschläge. Ich war mit der TimeSpan-Funktion nicht vertraut.



3
Müssen Sie sich darum kümmern, Mitternacht zu überqueren?
Gjutras

1
Mitternacht zu überqueren ist kein Problem, aber alles, was Mitternacht überspannt, ist sicher ein Fluch meiner Programmiererfahrung ...
John M

Antworten:


258

Zur Überprüfung der Tageszeit verwenden:

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
}

Für absolute Zeiten verwenden Sie:

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
}

Wie zähle ich die Anzahl der Übereinstimmungen? Zum Beispiel möchte ich zählen, wie viele Samstage und Sonntage im Bereich liegen.
pbies

@pmbiesiada: Dies liegt völlig außerhalb des Rahmens der ursprünglichen Frage (und der Antwort). Sie sollten dies zu einer neuen Frage machen, aber hier auf SO einen Versuch machen, wenn so etwas schon einmal beantwortet wurde. Viel Glück.
Frank Bollack

1
Was ist, wenn es unterschiedliche Zeiten für verschiedene Tage gibt? Gibt es ein leicht zu vergleichendes? stackoverflow.com/questions/22769557/…
SearchForKnowledge

@SearchForKnowledge: Vergleichen Sie wofür? Bitte geben Sie genauer an, was Sie erreichen möchten, oder geben Sie einige Beispiele an.
Frank Bollack

4
Die Antwort unten sollte die akzeptierte sein ... Diese prüft nicht auf Zeitspannen über Tage, z. B. von 22:00:00 bis 02:00:00 ...
FranzHuber23

117

Einige gute Antworten hier, aber keine decken den Fall ab, dass Ihre Startzeit an einem anderen Tag als Ihrer Endzeit liegt. Wenn Sie die Tagesgrenze überschreiten müssen, kann so etwas helfen:

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

Beachten Sie, dass in diesem Beispiel die Zeitgrenzen inklusive sind und dass dies immer noch einen Unterschied von weniger als 24 Stunden zwischen startund voraussetzt stop.


1
Was ist, wenn es unterschiedliche Zeiten für verschiedene Tage gibt? Gibt es ein leicht zu vergleichendes? stackoverflow.com/questions/22769557/…
SearchForKnowledge

Guter Punkt, das macht Sinn. Wenn die gemessene Zeit bis Mitternacht vergeht, wäre dies die einzige Antwort, die noch richtig wäre.
Sunsetquest

1
Danke, nach Stunden habe ich es versucht 11:57 pmund das hat funktioniert: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
Shaijut

1
Danke für das. Die Antwort scheint einfach zu sein, aber es ist etwas umständlich, sie zu konzipieren.
Sam, ich bin, sagt Reinstate Monica

Dies ist eine großartige Antwort. Ich schreibe eine Methode, um festzustellen, ob die Zeit einer bestimmtenDateTime bestimmten Geschäfts innerhalb der angegebenen Geschäftszeiten liegt. Die Geschäftszeiten können am selben Tag liegen, sie können jedoch auch zwei Tage umfassen (z. B. 15 bis 1 Uhr Betriebsstunden).
Drew

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

Wenn Sie wirklich einen String in einen TimeSpan analysieren möchten, können Sie Folgendes verwenden:

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

Danke, nach Stunden habe ich es versucht 11:57 pmund das hat funktioniert: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
Shaijut

16

Eine einfache kleine Erweiterungsfunktion dafür:

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
Gute Ergänzung Andre. Ich hätte nicht gedacht, einen OP-Vergleich für den Fall eines anderen Tages durchzuführen.
David

3
Tolles kleines Stück Code, aber ein Problem damit. Was ist, wenn Sie dieselbe Start- und Endzeit angeben? Eine Annahme ist, dass es bedeuten kann, dass es sich über einen Zeitraum von 24 Stunden erstrecken sollte, was bedeutet, dass Ihr Zustand, in den die Überprüfungen start <= endgeändert werden sollten, start < endund eine andere Annahme sein könnte, dass es am selben Tag ist, aber wenn dies der Fall ist, wird es wahrscheinlich fehlschlagen, wenn Sie verwenden Now.TimeOfDay, da es Millisekunden enthält und dazu führt, dass es außerhalb des Bereichs liegt.
Thierry

@ Thierry Netter Fang :) Sie können gerne versuchen, es zu beheben.
André Snede Kock

14

Versuchen Sie, das TimeRange-Objekt in C # zu verwenden, um Ihr Ziel zu erreichen.

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

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

Hier habe ich das Beispiel für die Verwendung von TimeRange


12
TimeRange ist keine Klasse aus einer C # -Bibliothek. Es ist eine externe Klasse, die unter dem obigen Link heruntergeladen werden kann.
Jpsy

6

Die TimeOfDayEigenschaft gibt einen TimeSpanWert zurück.

Versuchen Sie den folgenden Code:

TimeSpan time = DateTime.Now.TimeOfDay;

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

Auch new DateTime()ist das gleiche wie DateTime.MinValueund wird immer gleich sein 1/1/0001 12:00:00 AM. (Werttypen dürfen keine nicht leeren Standardwerte haben.) Sie möchten verwenden DateTime.Now.


2

Sie sind sehr nah dran, das Problem ist, dass Sie eine DateTime mit einer TimeOfDay vergleichen. Sie müssen lediglich die Eigenschaft .TimeOfDay am Ende Ihrer Convert.ToDateTime () -Funktionen hinzufügen.


2

Wird dies für die Behandlung des Tagesgrenzfalls einfacher sein? :) :)

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

Mit Linq können wir dies dadurch vereinfachen

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

    }
 }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.