如何在C#中检查一个DateTime是否大于另一个DateTime

139

我有两个DateTime对象:StartDateEndDate。我想确保StartDateEndDate之前。如何在C#中实现?

10个回答

256
if (StartDate < EndDate)
   // code

如果你只想获取日期,而不需要时间

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

1
注意:此处未考虑UTC时间和本地时间的差异,它将两者视为在同一时区。 - IronSean

30
if(StartDate < EndDate)
{}

DateTime支持普通比较运算符。


27
你可以使用重载的<或>运算符。
例如:
DateTime d1 = new DateTime(2008, 1, 1);
DateTime d2 = new DateTime(2008, 1, 2);
if (d1 < d2) { ...

10
if (StartDate>=EndDate)
{
    throw new InvalidOperationException("Ack!  StartDate is not before EndDate!");
}

7
StartDate < EndDate

7

虽然可能已经太晚了,但为了让其他可能会碰到这种情况的人受益,我使用了一个扩展方法来利用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
}

6

请看DateTime.Compare方法。


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 的边缘情况,但我并不担心这个问题。

2
        if (new DateTime(5000) > new DateTime(1000))
        {
            Console.WriteLine("i win");
        }

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);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接