Python:获得下一个工作时间段

时间:2018-05-30 08:14:08

标签: python datetime time

处理员工计划(Python 2.7),我在isoWeek中为给定的人员列出了工作日(和时间)。

在给定日期的情况下,我正在尝试确定工作人员的下一个日期何时可用。

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_date_week_day = searched_date.isoweekday()
  

预期结果:datetime.datetime(2018,6,14,10,00,00)//星期四10点

我本来希望只使用工作日来实现这个结果,但我对此表示怀疑。

我写的内容是最简单的例子(我的搜索时间大于工作人员的最终工作时间)

next_working_day = next((x for x in working_days if x >= searched_date_week_day), None)
  

给出:3,星期三

考虑到我会有更棘手的案例(让我们想象我的搜索日期是在星期天,isoweek 7,它不起作用),我唯一的出路是在某些datetime.datetime列表中转换我的work_days吗?

Fiddle

1 个答案:

答案 0 :(得分:1)

以你的小提琴为起点:

import datetime

working_days = [{'start': datetime.time(8, 0), 'end': datetime.time(17, 0), 'day': 1}, {'start': datetime.time(8, 0), 'end': datetime.time(17, 0), 'day': 2}, {'start': datetime.time(8, 0), 'end': datetime.time(17, 0), 'day': 3}, {'start': datetime.time(8, 0), 'end': datetime.time(17, 0), 'day': 4}]


searched_date = datetime.datetime(2018, 6, 13, 20, 57, 00)
searched_date_week_day = searched_date.isoweekday()

i = 0

while i < len(working_days) and working_days[i]['day'] < searched_date_week_day:
    i = i + 1

# if reached the end then next working day must be first day of next week
if i == len(working_days):
    next_working_day = working_days[0]
else:
    next_working_day = working_days[(i+1) % len(working_days)]
print next_working_day

它假定列表中的条目按天顺序排列。