Python: получите следующий рабочий временной интервал - PullRequest
0 голосов
/ 30 мая 2018

При планировании работы с персоналом (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?

Fiddle

1 Ответ

0 голосов
/ 30 мая 2018

Использование вашей скрипки в качестве отправной точки:

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

Предполагается, что записи в вашем списке расположены в порядке дня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...