Python datetime работает в заданном c часовом диапазоне - PullRequest
0 голосов
/ 13 января 2020

У меня есть исполнитель, который выполняет телефонные звонки в соответствии с указаниями пользователя.
Я хочу назначить время только в указанном c диапазоне часов в течение дня, например, с 8:00 до 18:00.
Исполнитель работает 24 часа в сутки и проверяет записи в базе данных, выполнять или нет телефонный звонок в данный момент.
Есть ли какой-нибудь хитрый способ планировать будущие звонки с помощью python datetime и каким-то образом установить эти работает часов с заданной частотой и количеством вызовов.
Например, я хочу запланировать 4 вызова с частотой 1 час. Допустим, это 4 вечера. Следующий звонок должен быть запланирован на 4 вечера, 5 вечера, а следующий - на следующий день в 8:00, 10:00.
Я ожидаю, что datetime будет работать в таких условиях, как показано ниже:

def schedule(no_of_calls: int, frequency: timedelta):
  dt = get_a_magic_datetime_with_hour_range()
  value = dt.now()  # this will get 4PM in above's example. Though if it would be 10PM it would return 8AM next day.
  for i in range(no_of_calls):
    save_to_db(value)
    value += frequency    

Я знаю, что я мог бы создать свой собственный working_datetime, который бы делал правильные проверки и возвращал значения из диапазона рабочих часов, но, возможно, уже есть что-то подобное.

Если вам все еще не пришла в голову идея - подумайте об этом как о парковочном счетчике - если вы платите не по часам - он будет считаться с начала оплаты часов на следующий день (или же, если прошло более 12 часов утра) ).

1 Ответ

0 голосов
/ 14 января 2020

Код должен быть достаточно понятным: он ничего не делает, кроме «чего-то» в 8 утра, 9 утра ... 5 вечера каждый день, начиная с пн 20 января 2020 года.

Обратите внимание, что я не сделал не проверял, но по крайней мере в принципе стратегия должна быть жизнеспособной. Я проверил различные if условия и обновил правила, но проверил их еще раз перед запуском бесконечного l oop, такого как этот.

#!/usr/bin/env python

'''
This code performs a certain (generic) action
every hour, from 8 AM to 5 PM of everyday, starting
from next monday, that is 20 Jan 2020.

This means the code performs 10 actions per day
and then does nothing for the next 14 hours.

Temporal precision is seconds.
'''

import time
from datetime import datetime

str_begin = 'Jan 20 08:00:00 +0000 2020'
next_action = int(datetime.timestamp(datetime.strptime(str_begin, '%b %d %H:%M:%S %z %Y')))  # Unix timestamp


one_hour = 3600                         # Number of seconds in an hour
waiting_time = 14 * one_hour

daily_count = 0

now = int(datetime.timestamp(datetime.now()))
while True:
    if now == next_action:

        # Make a call or whatever

        daily_count += 1
        if daily_count < 10:
            next_action += one_hour
        if daily_count == 10:              # At 5 PM daily_count will be 10 and next_action will be 6 PM. You reset the count and next_action to 8 AM.
            daily_count = 0
            next_action += waiting_time

    now = int(datetime.timestamp(datetime.now()))

...