86

我需要知道日期是否在 DateRange 之间。我有三个日期:

// 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

通常我会为这些事情创建Fowler 的 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)
于 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想法,并解决了该答案的一些问题,例如能够通过约束asIncludes在通用类中拥有方法。它也是不可变的,就像您对扩展其他值类型(如.TIComparable<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 回答