如何知道DateTime是否在C#中的日期范围之间

时间:2011-01-24 11:48:46

标签: c# .net datetime date-range

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

// The date range
DateTime startDate;
DateTime endDate;

DateTime dateToCheck;

简单的解决方案是进行比较,但有更聪明的方法吗?

提前致谢。

6 个答案:

答案 0 :(得分:107)

不,做一个简单的比较对我来说很好看:

return dateToCheck >= startDate && dateToCheck < endDate;

要考虑的事情:

  • DateTime在时区方面有点奇怪。它可能是UTC,它可能是“本地的”,它可能是模棱两可的。确保你将苹果与苹果进行比较。
  • 考虑您的起点和终点应该是包容性的还是排他性的。我已经将上面的代码视为包含下限和独占上限。

答案 1 :(得分:58)

通常我会为这些事情创建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)

答案 2 :(得分:34)

您可以使用扩展方法使其更具可读性:

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

现在你可以写:

dateToCheck.InRange(startDate, endDate)

答案 3 :(得分:7)

您可以使用:

return (dateTocheck >= startDate && dateToCheck <= endDate);

答案 4 :(得分:5)

在进行任何日期数学运算时,我发现以下库最有用。我仍然感到惊讶,因为这是.Net框架的一部分。

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

答案 5 :(得分:0)

根据谢尔盖(Sergey)的answer,我认为这个更通用的版本更符合福勒(Fowler)的Range的想法,并解决了该问题的一些问题,例如能够拥有{{通过将Includes约束为T来在通用类中使用1}}方法。就像您希望扩展其他值类型(如IComparable<T>)的功能的类型一样,它也是不变的。

DateTime