Проверьте, находится ли какое-либо время в списке между двумя временными метками - PullRequest
0 голосов
/ 30 ноября 2018

Я выполняю некоторые запланированные задачи в Python.Мастер-программа работает 24/7 и выполняет отдельные задачи аналогично cron.Мне нужно определить, нужно ли запускать задачу снова из времен.

В этом случае у меня будет время последнего запуска задачи, текущее время (обе метки времени Unix, полученные с помощью * 1003).* и легко конвертируется в datetime.datetime объекты), а также запланированное время (например, каждую 15-ую минуту каждый час, например 0:15, 1:15, ..., 23:15).Я хочу определить, находится ли какое-либо из запланированных моментов времени между последним временем выполнения и текущим временем, вероятно, как логическое значение.Гарантируется, что запланированное время всегда является «временем» (например, «2:00») и не включает «дату» (например, 1-е число любого месяца или любого понедельника).

Пример данных:

import datetime

scheduled = [datetime.time(h, m) for h, m in [(0, 15), (6, 15), (12, 15), (18, 15)]]
previous = datetime.datetime(2018, 11, 30, 5)
truthy = datetime.datetime(2018, 11, 30, 7)
falsey = datetime.datetime(2018, 11, 30, 6)

# some_method() is what I want
assert some_method(scheduled, previous, falsey) is False
assert some_method(scheduled, previous, truthy) is True

И вот некоторые особые случаи, которые я также хотел бы охватить

scheduled = [datetime.time(1, 0)]  # 1:00 AM
previous = datetime.datetime(2018, 11, 30, 23)
truthy = datetime.datetime(2018, 12, 1, 2, 0)
falsey = datetime.datetime(2018, 12, 1, 0, 30)

assert some_method(scheduled, previous, falsey) is False
assert some_method(scheduled, previous, truthy) is True

Приведенный выше пример должен быть True, потому что запланированное время «1 AM» находится между «11 PM».30 ноября "и" 2 часа ночи 1 декабря ".Я не могу сравнивать время напрямую, потому что «1:00» не находится между «2:00» и «11:00» в один и тот же день, а между двумя значениями времени в разные дни.

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Как насчет использования timedelta и сравнения timetuple s?

def some_method(scheduled, prev, datetime_to_check):
    yesterday = datetime_to_check - datetime.timedelta(days=1)
    schedule = [(*yesterday.timetuple()[:3], s.hour, s.minute) for s in scheduled]
    schedule.extend((*datetime_to_check.timetuple()[:3], s.hour, s.minute) for s in scheduled)
    prev_tup = prev.timetuple()
    check_tup = datetime_to_check.timetuple()
    for scheduled_time in schedule:
        if prev_tup < scheduled_time < check_tup:
            return True
    return False
0 голосов
/ 30 ноября 2018

Кажется, что простым методом является следующая функция:

def some_method(scheduled, prev, next):
    date1 = prev.date()
    date2 = next.date()
    if (next - prev).total_seconds() > 86400:
       return True
    for s in scheduled:
        for date in {date1, date2}:
            temp = datetime.datetime(date.year, date.month, date.day, s.hour, s.minute, s.second)
            if prev < temp < next:
                return True
    return False

Я оставлю это другим, чтобы его подтитировать, но, похоже, это сработает.

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