C#で1つのDateTimeが他のDateTimeより大きいかどうかを確認する方法


105

との2つのDateTimeオブジェクトがStartDateありEndDateます。StartDate前に確認したいですEndDate。これはC#でどのように行われますか?

回答:


210
if (StartDate < EndDate)
   // code

時刻ではなく日付だけが必要な場合

if (StartDate.Date < EndDate.Date)
    // code



23

オーバーロードされた<または>演算子を使用できます。

例えば:

DateTime d1 = new DateTime(2008, 1, 1);
DateTime d2 = new DateTime(2008, 1, 2);
if (d1 < d2) { ...




5

これはおそらく手遅れですが、これに出くわす可能性のある他の人々のために、私は次のIComparableようにしてこれを行う拡張メソッドを使用しました:

public static class BetweenExtension
    {
        public static bool IsBetween<T>(this T value, T min, T max) where T : IComparable
        {
            return (min.CompareTo(value) <= 0) && (value.CompareTo(max) <= 0);
        }
    }

この拡張メソッドを使用して IComparable、このメソッドがより汎用的になり、日付だけでなくさまざまなデータ型で使用できるようになります。

次のように使用します。

DateTime start = new DateTime(2015,1,1);
DateTime end = new DateTime(2015,12,31);
DateTime now = new DateTime(2015,8,20);

if(now.IsBetween(start, end))
{
     //Your code here
}

3

同じ要件がありましたが、受け入れられた回答を使用した場合、それは私のすべての単体テストを満たしていませんでした。私にとっての問題は、開始日と終了日を含む新しいオブジェクトがあり、開始日を設定する必要がある場合です(この段階では、終了日には01/01/0001の最小日付値があります)-このソリューションはすべて合格しました私のユニットテスト:

    public DateTime Start
    {
        get { return _start; }
        set
        {
            if (_end.Equals(DateTime.MinValue))
            {
                _start = value;
            }
            else if (value.Date < _end.Date)
            {
                _start = value;
            }
            else
            {
                throw new ArgumentException("Start date must be before the End date.");
            }
        }
    }


    public DateTime End
    {
        get { return _end; }
        set
        {
            if (_start.Equals(DateTime.MinValue))
            {
                _end = value;
            }
            else if (value.Date > _start.Date)
            {
                _end = value;
            }
            else
            {
                throw new ArgumentException("End date must be after the Start date.");
            }
        }
    }

開始日と終了日の両方が01/01/0001になる可能性があるというエッジケースを見逃していますが、私はそれについて心配していません。



0

.Dateに変換すると、時間/分/秒などを気にする必要がないことを示したいと思います。

    [Test]
    public void ConvertToDateWillHaveTwoDatesEqual()
    {
        DateTime d1 = new DateTime(2008, 1, 1);
        DateTime d2 = new DateTime(2008, 1, 2);
        Assert.IsTrue(d1 < d2);

        DateTime d3 = new DateTime(2008, 1, 1,7,0,0);
        DateTime d4 = new DateTime(2008, 1, 1,10,0,0);
        Assert.IsTrue(d3 < d4);
        Assert.IsFalse(d3.Date < d4.Date);
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.