日付がDateRangeの間にあるかどうかを知る必要があります。私は3つの日付があります:
// The date range
DateTime startDate;
DateTime endDate;
DateTime dateToCheck;
簡単な解決策は比較を行うことですが、これを行うよりスマートな方法はありますか?
前もって感謝します。
いいえ、単純な比較を行うことは私には良さそうです:
return dateToCheck >= startDate && dateToCheck < endDate;
考えるべきこと:
DateTime
は、タイムゾーンの点でやや奇妙なタイプです。 UTC、「ローカル」、あいまいな可能性があります。リンゴとリンゴを比較していることを確認してください。通常、私は 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)
拡張メソッドを使用して、もう少し読みやすくすることができます。
public static class DateTimeExtensions
{
public static bool InRange(this DateTime dateToCheck, DateTime startDate, DateTime endDate)
{
return dateToCheck >= startDate && dateToCheck < endDate;
}
}
今、あなたは書くことができます:
dateToCheck.InRange(startDate, endDate)
次を使用できます。
return (dateTocheck >= startDate && dateToCheck <= endDate);
次のライブラリは、あらゆる種類の日付の計算を行うときに最も役立つことがわかりました。私はまだ、これが.Netフレームワークの一部であることに驚かされません。
http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET
Sergeyの answer に続いて、このより一般的なバージョンはFowlerのRange
の考え方に沿ったものであり、Includes
T
をIComparable<T>
として制約することによる、汎用クラス内のメソッド。また、DateTime
のような他の値型の機能を拡張する型で期待するような不変です。
public struct Range<T> where T : IComparable<T>
{
public Range(T start, T end)
{
Start = start;
End = end;
}
public T Start { get; }
public T End { get; }
public bool Includes(T value) => Start.CompareTo(value) <= 0 && End.CompareTo(value) >= 0;
public bool Includes(Range<T> range) => Start.CompareTo(range.Start) <= 0 && End.CompareTo(range.End) >= 0;
}