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

Python 2.7中基于ISO周历计算员工下一个可用工作时段

解决方案:无需转换为datetime列表,直接计算下一个可用工作时间

不用非得把工作日转换成datetime.datetime列表来解决这个问题,我们可以通过星期循环计算和日期偏移的方式高效得到结果,避免生成不必要的日期序列。

核心思路

我们需要分两步判断:

  1. 检查查询日期当天是否还在工作时段内,如果是,当前时间就是可用时间(可根据需求调整为返回当天剩余工作时段的起点);如果不是,就找下一个工作日。
  2. 处理星期循环的情况:比如周五之后是周一,周日之后是周一,直接通过ISO星期数的循环逻辑找到下一个属于working_days的星期几,再计算对应的日期。

具体代码实现(Python 2.7)

import datetime

working_days = {
    1: {'start': datetime.time(8, 0), 'end': datetime.time(17, 15)},
    2: {'start': datetime.time(7, 45), 'end': datetime.time(17, 0)},
    3: {'start': datetime.time(8, 0), 'end': datetime.time(16, 45)},
    4: {'start': datetime.time(10, 0), 'end': datetime.time(15, 30)},
    5: {'start': datetime.time(8, 30), 'end': datetime.time(17, 15)}
}
searched_date = datetime.datetime(2018, 6, 13, 20, 57, 00)  # Wednesday
searched_weekday = searched_date.isoweekday()

def get_next_available_time(searched_dt, work_days):
    # 先检查当天是否是工作日,且当前时间在工作时段内
    if searched_weekday in work_days:
        work_start = datetime.datetime.combine(searched_dt.date(), work_days[searched_weekday]['start'])
        work_end = datetime.datetime.combine(searched_dt.date(), work_days[searched_weekday]['end'])
        if work_start <= searched_dt <= work_end:
            return searched_dt  # 如果当前在工作时间内,返回当前时间

    # 找下一个工作日的星期数:循环遍历后续的星期,直到找到在work_days里的
    next_weekday = None
    # 生成从下一天开始的星期序列(处理1-7的循环)
    for i in range(1, 8):
        candidate_weekday = (searched_weekday + i) % 7
        # ISO星期中7代表周日,%7后0对应周日,需转换为7
        if candidate_weekday == 0:
            candidate_weekday = 7
        if candidate_weekday in work_days:
            next_weekday = candidate_weekday
            break

    # 计算下一个工作日的日期偏移量
    days_to_add = (next_weekday - searched_weekday) % 7
    next_work_date = searched_dt.date() + datetime.timedelta(days=days_to_add)
    # 组合日期和对应工作日的开始时间
    next_available_dt = datetime.datetime.combine(next_work_date, work_days[next_weekday]['start'])

    return next_available_dt

# 测试执行
result = get_next_available_time(searched_date, working_days)
print(result)  # 输出: 2018-06-14 10:00:00

代码解释

  1. 当日工作时段检查:先判断查询日期是否属于工作日,且当前时间在当日工作时段内,如果满足则直接返回当前时间(可根据业务需求调整为返回当日工作时段的起点)。
  2. 循环查找下一个工作日:通过遍历后续7天的星期数(利用模运算处理跨周循环),快速定位第一个属于working_days的星期几。
  3. 日期偏移计算:用(next_weekday - searched_weekday) %7自动计算需要添加的天数,完美处理跨周末的情况(比如周五到周一自动计算为3天)。
  4. 时间组合:通过datetime.combine将找到的工作日日期与对应时段的开始时间合并,得到最终的可用时间戳。

这种方法无需生成大量日期列表,计算效率更高,尤其在查询日期跨度较大时优势明显。

内容的提问来源于stack exchange,提问作者Sebastien D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:12:39