如何在不考虑年份的情况下判断DateTime是否处于指定日期范围?
判断日期(不计年份)是否在指定区间的通用方案
要解决不计年份判断日期是否在两个日期之间的问题,核心是处理跨年区间的特殊场景,以下是可靠的实现思路和代码:
核心思路
通过将日期转换为**年中天数(DayOfYear)**来统一比较:
- 若区间起始日期(min)的年中天数 ≤ 结束日期(max)的年中天数:说明是同一年的连续区间,只需判断目标日期的年中天数落在该区间内。
- 若区间起始日期的年中天数 > 结束日期的年中天数:说明是跨年区间(如12月到次年2月),此时目标日期的年中天数要么≥起始日期的年中天数(对应原年份后半段),要么≤结束日期的年中天数(对应下一年前半段)。
- 额外处理闰年的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
相关产品推荐
相关产品推荐

