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

Python技术需求:查找两个datetime对象之间指定时刻的所有出现实例

解决方案:遍历Datetime区间内的指定整点时刻

我来帮你搞定这个需求——找出两个datetime区间内,所有匹配指定小时列表的整点时刻,对吧?结合你给的例子,我整理了一套Python实现方案,逻辑清晰还能适配任意小时列表:

思路梳理

核心逻辑很简单:

  1. 先对输入的小时列表去重排序,避免重复或乱序导致的问题
  2. 从结束日期开始,逐天往前遍历,生成当天所有指定小时的整点时刻
  3. 检查每个生成的时刻是否落在给定的时间区间内,符合条件就收集起来
  4. 最后按时间倒序排列(和你示例的结果顺序一致,也可以改成正序)

代码实现

import datetime

def get_specified_hours_between(start: datetime.datetime, end: datetime.datetime, hours: list[int]) -> list[datetime.datetime]:
    # 对小时列表去重并排序,确保处理逻辑统一
    cleaned_hours = sorted(list(set(hours)))
    # 过滤掉0-23之外的无效小时
    cleaned_hours = [h for h in cleaned_hours if 0 <= h <= 23]
    
    result = []
    current_date = end.date()
    
    # 从结束日期往起始日期遍历每一天
    while current_date >= start.date():
        # 生成当天所有指定小时的整点时刻
        for hour in cleaned_hours:
            target_dt = datetime.datetime.combine(current_date, datetime.time(hour=hour))
            # 验证时刻是否在[start, end]区间内
            if start <= target_dt <= end:
                result.append(target_dt)
        # 往前推一天
        current_date -= datetime.timedelta(days=1)
    
    # 按时间倒序排列,和示例结果顺序一致
    result.sort(reverse=True)
    return result

测试示例

用你给出的测试数据跑一遍:

# 定义起始和结束时间
start_time = datetime.datetime(2021, 9, 6, 22, 11, 28, 793007)
end_time = datetime.datetime(2021, 9, 9, 0, 11, 33, 353162)
# 指定要匹配的小时:午夜0点和正午12点
target_hours = [0, 12]

# 获取结果
output = get_specified_hours_between(start_time, end_time, target_hours)
for dt in output:
    print(dt)

运行后输出和你期望的完全一致:

2021-09-09 00:00:00
2021-09-08 12:00:00
2021-09-08 00:00:00
2021-09-07 12:00:00
2021-09-07 00:00:00

灵活调整

  • 如果需要按正序输出,只需要把result.sort(reverse=True)改成result.sort()即可
  • 小时列表支持任意0-23的整数组合,比如[0,4,8,12,16,20]或者[3,17]都能正常处理
  • 代码自动过滤了无效小时(比如大于23或小于0的数值),避免报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 12:03:10