You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不考虑年份的情况下判断DateTime是否处于指定日期范围?

判断日期(不计年份)是否在指定区间的通用方案

要解决不计年份判断日期是否在两个日期之间的问题,核心是处理跨年区间的特殊场景,以下是可靠的实现思路和代码:

核心思路

通过将日期转换为**年中天数(DayOfYear)**来统一比较:

  1. 若区间起始日期(min)的年中天数 ≤ 结束日期(max)的年中天数:说明是同一年的连续区间,只需判断目标日期的年中天数落在该区间内。
  2. 若区间起始日期的年中天数 > 结束日期的年中天数:说明是跨年区间(如12月到次年2月),此时目标日期的年中天数要么≥起始日期的年中天数(对应原年份后半段),要么≤结束日期的年中天数(对应下一年前半段)。
  3. 额外处理闰年的2月29日:若目标日期是2月29日,而比较年份非闰年,将其转换为2月28日的年中天数,避免闰年导致的天数差异。

C# 实现代码

public static bool IsDateInRangeIgnoringYear(DateTime toCheck, DateTime min, DateTime max)
{
    int checkDay = toCheck.DayOfYear;
    int minDay = min.DayOfYear;
    int maxDay = max.DayOfYear;

    // 处理闰年2月29日的特殊情况
    if (!DateTime.IsLeapYear(min.Year) && toCheck.Month == 2 && toCheck.Day == 29)
    {
        checkDay = new DateTime(min.Year, 2, 28).DayOfYear;
    }
    else if (!DateTime.IsLeapYear(max.Year) && toCheck.Month == 2 && toCheck.Day == 29)
    {
        checkDay = new DateTime(max.Year, 2, 28).DayOfYear;
    }

    if (minDay <= maxDay)
    {
        // 同一年区间
        return checkDay >= minDay && checkDay <= maxDay;
    }
    else
    {
        // 跨年区间
        return checkDay >= minDay || checkDay <= maxDay;
    }
}

测试示例

示例1:同一年区间

DateTime toCheck = new DateTime(1900, 3, 4);
DateTime min = new DateTime(2024, 1, 1);
DateTime max = new DateTime(2024, 12, 31);
// 返回 True,符合预期

示例2:跨年区间

DateTime toCheck = new DateTime(1900, 1, 1);
DateTime min = new DateTime(2024, 12, 1);
DateTime max = new DateTime(2025, 2, 1);
// 返回 True,符合预期

内容的提问来源于stack exchange,提问作者Behemoth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 15:56:16