86

日付がDateRangeの間にあるかどうかを知る必要があります。私には3つの日付があります:

// The date range
DateTime startDate;
DateTime endDate;

DateTime dateToCheck;

簡単な解決策は比較を行うことですが、これを行うためのよりスマートな方法はありますか?

4

6 に答える 6

145

いいえ、簡単な比較を行うことは私には良さそうです:

return dateToCheck >= startDate && dateToCheck < endDate;

しかし、考えるべきこと:

  • DateTimeタイムゾーンの点でやや奇妙なタイプです。それはUTCである可能性があり、「ローカル」である可能性があり、あいまいである可能性があります。リンゴとリンゴを比較していることを確認してください。
  • 開始点と終了点が包括的であるか排他的であるかを検討してください。上記のコードを包括的下限と排他的上限として扱うようにしました。
于 2011-01-24T11:50:12.570 に答える
67

通常、私はそのようなもののためにファウラーの範囲の実装を作成します。

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)
于 2011-01-24T12:02:36.053 に答える
49

拡張メソッドを使用して、もう少し読みやすくすることができます。

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

今、あなたは書くことができます:

dateToCheck.InRange(startDate, endDate)
于 2011-01-24T13:12:33.647 に答える
9

次を使用できます。

return (dateTocheck >= startDate && dateToCheck <= endDate);
于 2011-01-24T11:50:50.383 に答える
5

次のライブラリは、あらゆる種類の日付計算を行うときに最も役立つことがわかりました。これが.Netフレームワークの一部であることに私はまだ驚いていません。

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

于 2013-10-17T21:52:49.600 に答える
2

Sergeyの回答に続いて、このより一般的なバージョンはFowlerのアイデアに沿ったものであり、として制約することで一般的なクラス内Rangeにメソッドを含めることができるなど、その回答に関するいくつかの問題を解決すると思います。また、などの他の値型の機能を拡張する型で期待されるものと同様に不変です。IncludesTIComparable<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;
}
于 2019-03-14T10:20:24.230 に答える