2011-01-24 3 views
54

日付がDateRangeかどうかを知る必要があります。私は3つの日付を持っています:DateTimeがCのDateRangeの間にあるかどうかを確認する方法

// The date range 
DateTime startDate; 
DateTime endDate; 

DateTime dateToCheck; 

簡単な解決方法は比較していますが、これを行うにはよりスマートな方法がありますか?

ありがとうございます。

+1

日付がその日付の間にあるかどうかを確認するよりスマートな方法ですか? –

+2

簡単な解決策よりも賢明な点は何ですか? – Polyfun

答えて

89

いや、単純な比較を行うことは私にはよさそうだ。しかし考える

return dateToCheck >= startDate && dateToCheck < endDate; 

もの:

  • DateTimeは、タイムゾーンの面でやや奇妙なタイプです。それはUTCかもしれない、それは "ローカル"かもしれない、それはあいまいかもしれない。あなたがリンゴとリンゴを比較していることを確認してください。
  • あなたの開始点と終了点がインクルーシブか排他的かを考慮してください。上のコードを包括的な下限と排他的な上限として扱いました。
+0

はい。あなたが比較している 'DateTime'が同じ種類(UTC/Local)であることを確認することが重要です。種類が異なると、両方を共通の種類に変換する代わりに、生の時間が比較されます。 – CodesInChaos

+4

'return startDate <= dateToCheck && dateToCheck

+4

@MauricioMorales:それは依存します。 「変化するビット」(チェックする日付)を一貫して左側に読みやすくする方がいらっしゃいます。それは私がやっていることです。私は「年代順」のアプローチの利点も理解できますが、個人的に私がそれを得た方法を好むと思います。 –

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) 
+0

ちょっとばかげた観察では、コンストラクタが開始が終了よりも確実であるかどうかを確認する必要はありません。そうでなければ、ロジックを破壊します...特にIncludes(IRange ) –

+0

ManそれはLINQでも動作します。同様に: var valueFromVacationsList = vacationBookingsForThisMonth.FirstOrDefault(s =>(s.Id == currentUser.Id)&& new DateRange(s.StartDateTime、s.EndDateTime)。Includes(itemDate)); – Kadaj

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) 
+16

良いアプローチですが、私は 'IsInRange()'を関数名 – Andrew

4

私は以下のライブラリを見つけることができましたあらゆる種類の日付計算を行うときに最も役立ちます。私はまだこれが.Netフレームワークの一部であるようなものは驚きです。

http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET

+0

として使用したいと思います。 .NETにはネイティブの日付演算アセンブリがないとは思えません。ライブラリを共有してくれてありがとう – BoundForGlory

関連する問題