如何在计算日期时间差时仅统计每日指定的7小时?
解决方案
要实现仅统计每个自然日中的7小时,需要拆分三个部分计算总时长:起始日的有效时长、中间完整自然日的固定时长、结束日的有效时长,具体逻辑和代码如下:
核心逻辑
- 若起始时间
dt1和结束时间dt2在同一天:计算两者实际时间差,最多按7小时统计(超过7小时则取7小时) - 若不在同一天:
- 计算起始日从
dt1到当天结束的时长,最多计入7小时 - 计算结束日从当天开始到
dt2的时长,最多计入7小时 - 统计中间完整自然日的数量,每个完整日固定加7小时
- 计算起始日从
- 将三部分时长相加得到最终结果
修改后的代码
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
相关产品推荐
相关产品推荐

