如何知道DateTime是否在C#中的DateRange之间

Dan*_*lba 69 .net c# datetime date-range

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

// The date range
DateTime startDate;
DateTime endDate;

DateTime dateToCheck;
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Jon*_*eet 114

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

return dateToCheck >= startDate && dateToCheck < endDate;
Run Code Online (Sandbox Code Playgroud)

值得考虑的事情:

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

  • `return startDate <= dateToCheck && dateToCheck <endDate`似乎更具可读性. (6认同)
  • @MauricioMorales:这取决于; 有些人发现更容易阅读"变化的位"(要检查的日期)始终在左侧.这就是我倾向于做的事情.我也可以看到"按时间顺序"方法的优点,但我认为我个人更喜欢我的方式. (6认同)

Ser*_*kiy 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法非常简单:

DateRange range = new DateRange(startDate, endDate);
range.Includes(date)
Run Code Online (Sandbox Code Playgroud)

  • 只是一个愚蠢的观察,构造函数是否需要确保开始小于结束,如果没有,它会破坏逻辑......尤其是在 Includes(IRange&lt;DateTime&gt; range) (2认同)
  • 伙计,这是一个很好的解决方案,甚至可以与LINQ一起使用。像这样:var valueFromVacationsList = vacationBookingsForThisMonth.FirstOrDefault(s =&gt;(s.Id == currentUser.Id)&amp;&amp; new DateRange(s.StartDateTime,s.EndDateTime).Includes(itemDate)); (2认同)

Eli*_*ing 38

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

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

现在你可以写:

dateToCheck.InRange(startDate, endDate)
Run Code Online (Sandbox Code Playgroud)

  • 不错的方法,虽然我使用`IsInRange()`作为函数名 (25认同)

Wra*_*ath 8

您可以使用:

return (dateTocheck >= startDate && dateToCheck <= endDate);
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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