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

如何编写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

相关产品推荐
方舟 Agent Plan

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

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