2017-06-05 9 views
1

Was ist der sauberste Weg zu prüfen, ob ein geliefertes Datum in einem bestimmten Datumsbereich liegt? Zum Beispiel:Der sauberste Weg, um zu prüfen, ob ein Datum in einem Bereich liegt (nullbares Datum)

DateTime? maxDate 
DateTime? minDate 
DateTime? userDate 

Ich möchte überprüfen, ob die Userdate im Bereich liegt. Wobei min oder max null sein kann.

So zum Beispiel:

minDate = new DateTime(2017, 1, 1); 
maxDate = null; 
userDate = new DateTime(2017, 5, 3); 

In diesem Szenario Userdate im Bereich wäre, da es größer ist dann der minDate und kein MaxDate angegeben wurde.

Ich dachte über die Verwendung von DateTime.Compare, aber es scheint, dass ich eine Unordnung von if/then Anweisungen erstellen würde, um userDate zu den minDate- und maxDate-Variablen zu überprüfen, da DateTime.Compare nur zwei Daten gleichzeitig vergleicht.

Antwort

2

Unter der Annahme, null min/max würde in dieser Richtung ‚unbegrenzt‘ bedeutet, könnten Sie nutzen die Tatsache, dass DateTime selbst Grenzen hat.

Zum Beispiel:

public bool IsDateInRange(DateTime value, DateTime? min, DateTime? max) 
{ 
    //Use provided min/max times if they were not null. Fallback to Min/Max supported values from DateTime 
    min = min ?? DateTime.MinValue; 
    max = max ?? DateTime.MaxValue; 

    return value >= min && value <= max; 
} 

Ich bin nicht wirklich sicher, wie man den Fall, in dem userDate = null zu handhaben möchte. Ist das jemals in Reichweite? Also meine Beispielfunktion erlaubt es nicht. In diesem Fall könnten Sie es explizit behandeln, wenn Sie dieses Verhalten definieren möchten.

+1

Gute Antwort. Nebenbei bemerkt sollten Sie [beim Vergleichen von Daten in UTC umrechnen] (https://stackoverflow.com/questions/6930489/safely-comparing-local-and-universal-datetimes) oder sonst könnte es zu einem falschen Vergleich kommen , besonders wenn Sie Zeiten vergleichen, die in die zusätzliche Stunde fallen, die für DST hinzugefügt oder entfernt wird, –

+0

Um das hinzuzufügen, könnten Sie minDate.GetValueOrDefault (DateTime.MinValue) verwenden –

0
if((minDate == null || minDate < userDate) && (maxDate == null || maxDate > userDate)) { 
    // Do something 
} 
Verwandte Themen