На 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)