跨年度日期范围下,周/季度/月/日的归属校验需求
跨年度日期归属校验功能完善与实现
需求说明
需实现四类日期归属校验功能:
- 判断指定年份的某一周是否处于
startDate与endDate之间 - 判断指定年份的某一季度是否处于该日期范围
- 判断指定年份的某一月是否处于该日期范围
- 判断指定日期是否处于该日期范围
现有问题
现有代码仅在startDate与endDate同年时有效,跨年度场景下逻辑失效,需完善已有ForWeek、ForQuarter、ForDay函数,并补充实现ForMonth函数。
完善后的各函数实现
ForWeek函数(修复跨年度逻辑)
void ForWeek(int year, int week) { // 参数合法性校验 if (week < 1 || week > 53) throw new ArgumentOutOfRangeException(nameof(week), "周数必须在1-53之间"); // 获取目标周的起始和结束日期(ISO周以周一为起始) var targetWeekStart = ISOWeek.ToDateTime(year, week, DayOfWeek.Monday); var targetWeekEnd = targetWeekStart.AddDays(6); // 判断目标周与日期范围是否存在交集 bool isInRange = !(targetWeekEnd < x.StartDate.Date || targetWeekStart > x.EndDate.Date); // 校验通过后的业务逻辑 if (isInRange) { // TODO: 执行对应操作 } }
ForQuarter函数(修复跨年度逻辑)
void ForQuarter(int year, int quarter) { // 参数合法性校验 if (quarter < 1 || quarter > 4) throw new ArgumentOutOfRangeException(nameof(quarter), "季度必须在1-4之间"); // 计算目标季度的起始、结束日期 int quarterStartMonth = (quarter - 1) * 3 + 1; var targetQuarterStart = new DateTime(year, quarterStartMonth, 1); var targetQuarterEnd = targetQuarterStart.AddMonths(3).AddDays(-1); // 判断目标季度与日期范围是否存在交集 bool isInRange = !(targetQuarterEnd < x.StartDate.Date || targetQuarterStart > x.EndDate.Date); // 校验通过后的业务逻辑 if (isInRange) { // TODO: 执行对应操作 } }
ForDay函数(修复逻辑错误与跨年度支持)
void ForDay(DateTime day) { // 判断指定日期是否在目标范围内 bool isInRange = day.Date >= x.StartDate.Date && day.Date <= x.EndDate.Date; // 校验通过后的业务逻辑 if (isInRange) { // TODO: 执行对应操作 } }
ForMonth函数(补充实现,支持跨年度)
void ForMonth(int year, int month) { // 参数合法性校验 if (month < 1 || month > 12) throw new ArgumentOutOfRangeException(nameof(month), "月份必须在1-12之间"); // 计算目标月份的起始、结束日期 var targetMonthStart = new DateTime(year, month, 1); var targetMonthEnd = targetMonthStart.AddMonths(1).AddDays(-1); // 判断目标月份与日期范围是否存在交集 bool isInRange = !(targetMonthEnd < x.StartDate.Date || targetMonthStart > x.EndDate.Date); // 校验通过后的业务逻辑 if (isInRange) { // TODO: 执行对应操作 } }
内容的提问来源于stack exchange,提问作者Steven2105
相关产品推荐
相关产品推荐

