На Python - разработка, если время между двумя раз

Я пытаюсь найти самый чистый / самый питонический способ оценки, если" сейчас " находится между двумя временами; однако; время начала/конца может или не может, упасть через границу дня - например (просто используя простые примеры):

onhour=23
onmin=30
offhour=4
offmin=15
timenow = datetime.datetime.now().time()

делаем прямые if START < NOW < END сценарий не будет работать для этого!

В настоящее время у меня есть код, который оценивает, является ли он в настоящее время "ночным", который выглядит следующим образом:

def check_time(timenow, onhour, onmin, offhour, offmin, verbose):
    now = datetime.datetime.now()
    now_time = now.time()
    # If we're actually scheduling at night:
    if int(offhour) < int(onhour):
        # Check to see if we're in daylight times (ie. off schedule)
        if datetime.time(int(offhour),int(offmin)) <= now_time <= datetime.time(int(onhour),int(onmin)):
            if verbose == True:
                print("Day Time detected.")
            return False
        else:
            if verbose == True:
                print("Night Time detected.")
            return True
    else:
        if datetime.time(int(onhour),int(onmin)) <= now_time <= datetime.time(int(offhour),int(offmin)):
            if verbose == True:
                print("Night Time detected.")
            return True
        else:
            if verbose == True:
                print("Day Time detected.")
            return False

извинения, если название не звучит как ничего нового, но рассмотрев несколько существующих ответов на подобные проблемы, такие как:

Я заметил, что они, похоже, не учитывают случаи, когда время начала и окончания происходит за границу дня.

В дополнение к этому; любые идеи, связанные с добавлением дневного планирования, также были бы весьма полезны! то есть. "для Пн-Пт включите в 23: 00, выключите 04: 00" - но управление на и выключен на день с обеих сторон (иначе; что-то будет включено в пятницу, но не будет выключено в субботу-и все же, включая субботу, означает, что он снова включается в 23!...)

я рассмотрел возможность сделать простой "включить в X, спать для Y", чтобы обойти это... но если сценарий запускается во время цикла "On", он не будет инициирован до следующего запуска... Но, похоже, самый простой вариант! :)

Я надеюсь, что есть какой-то удивительный модуль, который делает все это... : D

совместимость Python2.7-3.2 для меня тоже очень важно!

3 ответов


ваш код немного хаотичный. Я бы сделал что-то вроде этого:

import datetime

DAY, NIGHT = 1, 2
def check_time(time_to_check, on_time, off_time):
    if on_time > off_time:
        if time_to_check > on_time or time_to_check < off_time:
            return NIGHT, True
    elif on_time < off_time:
        if time_to_check > on_time and time_to_check < off_time:
            return DAY, True
    elif time_to_check == on_time:
        return None, True
    return None, False


on_time = datetime.time(23,30)
off_time = datetime.time(4,15)
timenow = datetime.datetime.now().time()
current_time = datetime.datetime.now().time()

when, matching = check_time(current_time, on_time, off_time)

if matching:
    if when == NIGHT:
        print("Night Time detected.")
    elif when == DAY:
        print("Day Time detected.")

чтобы узнать, находится ли заданное время (без даты) между заданным началом, концом (конец не включен):

def in_between(now, start, end):
    if start <= end:
        return start <= now < end
    else: # over midnight e.g., 23:30-04:15
        return start <= now or now < end

пример:

from datetime import datetime, time

print("night" if in_between(datetime.now().time(), time(23), time(4)) else "day")

def is_hour_between(start, end, now):
    is_between = False

    is_between |= start <= now <= end
    is_between |= end < start and (start <= now or now <= end)

    return is_between

тест:

assert is_hour_between(6, 10, 6)
assert not is_hour_between(6, 10, 4)
assert is_hour_between(17, 20, 17)
assert not is_hour_between(17, 20, 16)