Python技术需求:查找两个datetime对象之间指定时刻的所有出现实例
解决方案:遍历Datetime区间内的指定整点时刻
我来帮你搞定这个需求——找出两个datetime区间内,所有匹配指定小时列表的整点时刻,对吧?结合你给的例子,我整理了一套Python实现方案,逻辑清晰还能适配任意小时列表:
思路梳理
核心逻辑很简单:
- 先对输入的小时列表去重排序,避免重复或乱序导致的问题
- 从结束日期开始,逐天往前遍历,生成当天所有指定小时的整点时刻
- 检查每个生成的时刻是否落在给定的时间区间内,符合条件就收集起来
- 最后按时间倒序排列(和你示例的结果顺序一致,也可以改成正序)
代码实现
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
相关产品推荐
相关产品推荐

