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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:54:03