如何编写Python函数判断timestamp是否在指定Timedelta时段范围内
你的思路是正确的,核心逻辑可以跑通,不过有几个需要注意的边界问题需要处理,避免踩坑:
- 类型适配:如果你说的
current_time参数是Unix时间戳(浮点型),需要先调用datetime.fromtimestamp(current_time, tz=目标时区)转成datetime对象再做后续计算。 - 时区适配:如果
current_time是带时区的datetime对象,计算当日起始时间时会自动适配对应时区,无需额外转换;如果是无时区的原生datetime对象,要确保和时段的时区规则一致,否则会出现时间偏移导致判断错误。 - 跨零点时段兼容:你当前给出的示例时段都未跨零点,如果后续需要支持类似
(Timedelta('0 days 23:00:00'), Timedelta('1 days 01:00:00'))这类跨零点的时段,原有逻辑会判断失效,这种场景可以把跨零点的时段拆成「当日23点到当日结束」「次日0点到次日1点」两个片段再分别判断。 - 边界规则明确:提前确定时段是左闭右开还是全闭区间,比如刚好等于结束时间的11:00:00是否算在A时段内,判断逻辑对应调整为
start_ts <= current_time < end_ts或者start_ts <= current_time <= end_ts即可。
参考实现代码
from datetime import datetime, timedelta from typing import List, Tuple def is_in_market_hours(current_time: datetime, open_hours: List[Tuple[timedelta, timedelta]]) -> bool: # 取current_time对应日期的0点时刻 day_start = current_time.replace(hour=0, minute=0, second=0, microsecond=0) for start_delta, end_delta in open_hours: start_ts = day_start + start_delta end_ts = day_start + end_delta # 左闭右开规则,可根据需求调整 if start_ts <= current_time < end_ts: return True # 兼容跨零点的时段 if end_delta > timedelta(days=1): next_day_start = day_start + timedelta(days=1) next_end_ts = next_day_start + (end_delta - timedelta(days=1)) if next_day_start <= current_time < next_end_ts: return True return False
测试验证
按你给出的时段配置测试:
open_hours = [ (timedelta(hours=9), timedelta(hours=11)), (timedelta(hours=13), timedelta(hours=15)), (timedelta(hours=22), timedelta(hours=23)), ] # 测试9:15:55的场景 current = datetime(2024, 1, 1, 9, 15, 55) print(is_in_market_hours(current, open_hours)) # 输出True,符合预期
内容的提问来源于stack exchange,提问作者Guifan Li
相关产品推荐
相关产品推荐

