C#图书馆系统罚金计算:求两日期区间排除周日的总小时数实现方案
实现逻辑说明
核心思路是先计算两个时间的原始总时长,再统计时间区间内所有周日需要排除的时长,将原始总时长减去需排除的周日时长后,得到最终的有效逾期时长。
具体实现步骤
- 先计算两个日期的原始时间差总小时数
- 统计区间内的完整周日数量,每个完整周日扣除24小时
- 单独判断起始日期如果是周日,扣除当天从起始时间到24点的时长
- 单独判断结束日期如果是周日,扣除当天从0点到结束时间的时长
- 最终有效时长取计算结果和0的最大值,避免出现负数异常
调整后的C#代码
mydt1 = Convert.ToDateTime(dt.Rows[0].ItemArray[7].ToString()); DateTime dt2 = DateTime.Now; TimeSpan totalSpan = dt2 - mydt1; double validHours = totalSpan.TotalHours; if (validHours > 0) { double excludeHours = 0; // 计算区间内的完整周日数量 DateTime firstSunday = mydt1.Date.AddDays(7 - (int)mydt1.DayOfWeek); DateTime lastSunday = dt2.Date.AddDays(-(int)dt2.DayOfWeek); if (firstSunday <= lastSunday) { int fullSundayCount = (int)(lastSunday - firstSunday).TotalDays / 7 + 1; excludeHours += fullSundayCount * 24; } // 处理起始日为周日的情况 if (mydt1.DayOfWeek == DayOfWeek.Sunday) { double sundayLeftHours = (mydt1.Date.AddDays(1) - mydt1).TotalHours; excludeHours += sundayLeftHours; } // 处理结束日为周日的情况 if (dt2.DayOfWeek == DayOfWeek.Sunday) { double sundayPassedHours = (dt2 - dt2.Date).TotalHours; excludeHours += sundayPassedHours; } validHours = Math.Max(0, validHours - excludeHours); txtElapse.Text = validHours.ToString("0"); var totals = validHours * 2; txtFine.Text = totals.ToString("0"); } else { txtFine.Text = "0"; txtElapse.Text = "0"; }
注意事项
- 代码适配C#自带的
DayOfWeek枚举规则,周日对应枚举值为0,不需要额外调整枚举映射 - 所有边界场景(起止日期为周日、区间刚好覆盖整周、区间小于1天等)均做了兼容,不会出现多扣/漏扣时长的问题
内容的提问来源于stack exchange,提问作者Dark Akira
相关产品推荐
相关产品推荐

