datetime.now()判断跨两天UTC时间区间的实现问题及时间差计算需求
跨天时间区间判断解决方案
核心解决思路
- 先将
execute_after、execute_before、待校验的当前时间统一转换为距离当日0点的timedelta对象,剥离日期属性仅保留时分秒的差值属性 - 根据两个区间端点的大小自动识别是否为跨天场景,适配不同的判断逻辑
- 计算区间总时长时,跨天场景给结束时间加24小时再做减法,即可得到正确的时长结果
适配两种场景的代码实现(Python)
from datetime import datetime, timedelta def str_to_timedelta(time_str: str) -> timedelta: """将HH:MM:SS格式的时间字符串转换为timedelta对象""" hours, minutes, seconds = map(int, time_str.split(":")) return timedelta(hours=hours, minutes=minutes, seconds=seconds) def check_time_range(execute_after: str, execute_before: str, check_time: datetime = None) -> tuple[bool, timedelta]: """ 校验当前时间是否落在指定区间内,支持跨天场景 返回值:(是否在区间内,区间总时长) """ # 未指定校验时间则默认取当前时间 check_time = check_time or datetime.now() current_td = timedelta( hours=check_time.hour, minutes=check_time.minute, seconds=check_time.second ) after_td = str_to_timedelta(execute_after) before_td = str_to_timedelta(execute_before) if after_td <= before_td: # 非跨天场景:区间为当日after到当日before total_duration = before_td - after_td is_in_range = after_td <= current_td <= before_td else: # 跨天场景:区间为当日after到次日before total_duration = before_td + timedelta(hours=24) - after_td is_in_range = current_td >= after_td or current_td <= before_td return is_in_range, total_duration # 测试示例 if __name__ == "__main__": # 跨天场景测试 after = "19:00:00" before = "05:00:00" _, duration = check_time_range(after, before) # 格式化输出为HH:MM:SS格式 duration_str = str(duration).split(", ")[-1] print(f"Time difference: '{duration_str}'")
运行结果
测试你给出的跨天场景时,输出完全符合预期:
Time difference: '10:00:00'
内容的提问来源于stack exchange,提问作者digitech
相关产品推荐
相关产品推荐

