我需要知道Date是否在DateRange之间。我有三个约会:
// The date range
DateTime startDate;
DateTime endDate;
DateTime dateToCheck;
简单的解决方案是进行比较,但是有更聪明的方法吗?
我需要知道Date是否在DateRange之间。我有三个约会:
// The date range
DateTime startDate;
DateTime endDate;
DateTime dateToCheck;
简单的解决方案是进行比较,但是有更聪明的方法吗?
Answers:
不,对我来说做一个简单的比较看起来不错:
return dateToCheck >= startDate && dateToCheck < endDate;
需要考虑的事情:
DateTime
在时区方面有点奇怪。它可以是UTC,可以是“本地”,也可以是模棱两可的。确保您正在比较苹果和苹果。DateTime
您比较的s是同一类型(UTC / Local),这一点很重要。对于不同的种类,将比较原始时间,而不是将两者都转换成相同的种类。
return startDate <= dateToCheck && dateToCheck < endDate
似乎更具可读性。
通常,我会为此类事情创建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)
您可以使用扩展方法使其更具可读性:
public static class DateTimeExtensions
{
public static bool InRange(this DateTime dateToCheck, DateTime startDate, DateTime endDate)
{
return dateToCheck >= startDate && dateToCheck < endDate;
}
}
现在您可以编写:
dateToCheck.InRange(startDate, endDate)
IsInRange()
作为函数名
我发现以下库在进行任何日期数学运算时最有帮助。我仍然没有感到惊讶,因为这是.Net框架的一部分。
http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET
根据Sergey的答案,我认为这个更通用的版本更符合Fowler的Range
想法,并解决了该答案的一些问题,例如能够Includes
通过将T
as约束为通用类中的方法IComparable<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;
}