2011-01-24 15 views
54

我需要知道Date是否在DateRange之間。我有三個日期:如何知道DateTime是否在C#中的DateRange之間

// The date range 
DateTime startDate; 
DateTime endDate; 

DateTime dateToCheck; 

簡單的解決方案是做一個比較,但有沒有更聰明的方法來做到這一點?

在此先感謝。

+1

的明智之選,然後只檢查日期是否是這些日期間? – 2011-01-24 11:50:26

+2

那麼什麼比簡單的解決方案更聰明? – Polyfun 2011-01-24 11:50:47

回答

89

不,做一個簡單的比較,對我來說很好:

return dateToCheck >= startDate && dateToCheck < endDate; 

事情要考慮,雖然:

  • DateTime在時區方面有點古怪型。它可能是UTC,它可能是「本地」,它可能是模糊的。確保你比較蘋果和蘋果。
  • 請考慮您的開始點和結束點是包含性的還是排除性的。我已經將上面的代碼視爲一個包含下界和獨佔上界。
+0

是的。確保你比較的'DateTime'屬於同一類型(UTC/Local),這很重要。用不同種類的原始時間進行比較,而不是將其轉換爲常見的種類。 – CodesInChaos 2011-01-24 11:57:57

+4

`return startDate <= dateToCheck && dateToCheck 2014-06-10 19:06:08

+4

@MauricioMorales:這取決於;有些人會發現閱讀「左右不變」的位置(檢查日期)會更容易。這是我傾向於做的。我可以看到「按時間順序」方法的優點,但我認爲我個人更喜歡這種方式。 – 2014-06-10 19:07:34

7

您可以使用:

return (dateTocheck >= startDate && dateToCheck <= endDate); 
52

通常我創建Fowler's Range實施這樣的事情。

public interface IRange<T> 
{ 
    T Start { get; } 
    T End { get; } 
    bool Includes(T value); 
    bool Includes(IRange<T> range); 
} 

public class DateRange : IRange<DateTime>   
{ 
    public DateRange(DateTime start, DateTime end) 
    { 
     Start = start; 
     End = end; 
    } 

    public DateTime Start { get; private set; } 
    public DateTime End { get; private set; } 

    public bool Includes(DateTime value) 
    { 
     return (Start <= value) && (value <= End); 
    } 

    public bool Includes(IRange<DateTime> range) 
    { 
     return (Start <= range.Start) && (range.End <= End); 
    } 
} 

用法很簡單:

DateRange range = new DateRange(startDate, endDate); 
range.Includes(date) 
29

你可以使用擴展方法,使之更加易讀一點:

public static class DateTimeExtensions 
{ 
    public static bool InRange(this DateTime dateToCheck, DateTime startDate, DateTime endDate) 
    { 
     return dateToCheck >= startDate && dateToCheck < endDate; 
    } 
} 

現在你可以這樣寫:

dateToCheck.InRange(startDate, endDate) 
相關問題