检查给定日期是否在年份的子集中(例如晚于 12 月 6 日)

Check if a given date is in a subset of the year (e.g. later than 6th of December)

如何确定给定的 DateTime 是否在一年中的某个子集中。例如,我想知道今天是否在 12 月 6 日和 1 月 2 日之间。该子集表示为日期范围,并且可能 "wrap around" 如给定的示例。

让我们假设 UTC,这样夏令时等就不是问题了。

是否有使用 .NET BCL 执行此操作的简洁方法?

要检查的日期和日期范围的"end points"应该是任意的。

DateTime 的比较运算符重载。为什么不使用类似的东西:

DateTime x = ...
if (x > new DateTime(2015, 12, 6)) {
    // ... do whatever ...
}

并将脏细节留给实现者(即 BCL)。

您明确说明了日期,所以我认为时间不是问题,我们可以忽略夏令时的复杂性 et.al。在这种情况下,您可以对年份中的日期进行一个简单的数字表达式,并且对循环情况有一点逻辑。我并不是说它很漂亮,但它会让你到达那里。例如:

void Main()
{
    var range = new DateRange(new DateTime(2015,12,6), new DateTime(2016,1,2));

    Console.WriteLine(range.IsDateInRange(new DateTime(2015, 12, 28)));
    Console.WriteLine(range.IsDateInRange(new DateTime(2015,  1,  1)));
    Console.WriteLine(range.IsDateInRange(new DateTime(2015,  1,  3)));
    Console.WriteLine(range.IsDateInRange(new DateTime(2015, 11, 28)));
}

public class DateRange
{
    public const int OneYearWrap = 1200;
    public int BeginValue { get; private set; }
    public int EndValue { get; private set; }

    public DateRange(DateTime begin, DateTime end)
    {
        BeginValue = DateValue(begin);
        EndValue = DateValue(end);
        if (EndValue < BeginValue) 
            EndValue += OneYearWrap;
    }

    public bool IsDateInRange(DateTime date)
    {
        int dateValue = DateValue(date);
        if (EndValue > OneYearWrap && dateValue < BeginValue)
            dateValue += OneYearWrap;
        return dateValue >= BeginValue && dateValue <= EndValue;
    }

    int DateValue(DateTime date)
    {
        return date.Month * 100 + date.Day;
    }
}