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

如何在计算日期时间差时仅统计每日指定的7小时?

解决方案

要实现仅统计每个自然日中的7小时,需要拆分三个部分计算总时长:起始日的有效时长、中间完整自然日的固定时长、结束日的有效时长,具体逻辑和代码如下:

核心逻辑

  1. 若起始时间dt1和结束时间dt2在同一天:计算两者实际时间差,最多按7小时统计(超过7小时则取7小时)
  2. 若不在同一天:
    • 计算起始日从dt1到当天结束的时长,最多计入7小时
    • 计算结束日从当天开始到dt2的时长,最多计入7小时
    • 统计中间完整自然日的数量,每个完整日固定加7小时
  3. 将三部分时长相加得到最终结果

修改后的代码

from datetime import datetime, timedelta

def get_total_hours():
    dt1 = datetime(2022, 7, 25, 18, 4, 4, 204105)  # 示例起始时间
    dt2 = datetime.now()  # 当前时间
    
    date1 = dt1.date()
    date2 = dt2.date()
    
    total_hours = 0.0
    
    if date1 == date2:
        # 同一天:取实际时长与7小时的较小值
        actual_hours = (dt2 - dt1).total_seconds() / 3600
        total_hours = min(actual_hours, 7)
    else:
        # 计算起始日剩余有效时长(最多7小时)
        end_of_day1 = datetime(date1.year, date1.month, date1.day, 23, 59, 59, 999999)
        hours_day1 = (end_of_day1 - dt1).total_seconds() / 3600
        total_hours += min(hours_day1, 7)
        
        # 计算结束日已过有效时长(最多7小时)
        start_of_day2 = datetime(date2.year, date2.month, date2.day)
        hours_day2 = (dt2 - start_of_day2).total_seconds() / 3600
        total_hours += min(hours_day2, 7)
        
        # 中间完整自然日的总时长
        full_days = (date2 - date1).days - 1
        total_hours += full_days * 7
    
    # 如需整数小时可转为int,否则直接返回浮点数
    return int(total_hours)

代码说明

  • end_of_day1:构造起始日的最后一刻,用于计算当日剩余时长
  • start_of_day2:构造结束日的起始时刻,用于计算当日已过时长
  • min(时长,7):确保单日统计时长不超过设定的7小时上限
  • full_days:通过日期差减1得到中间完整自然日的数量,避免重复计算首尾两天

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 09:45:35