Как определить, находится ли текущее время в указанном диапазоне с использованием модуля даты и времени Python?
Каким будет лучший способ увидеть, находится ли текущее время между словами 10:30 AM
и 4:30 PM
.
Я мог бы подумать о следующем, не уверен, насколько правильно:
from datetime import datetime
nw = datetime.now()
hrs = nw.hour;mins = nw.minute;secs = nw.second;
zero = timedelta(seconds = secs+mins*60+hrs*3600)
st = nw - zero # this take me to 0 hours.
time1 = st + timedelta(seconds=10*3600+30*60) # this gives 10:30 AM
time2 = st + timedelta(seconds=16*3600+30*60) # this gives 4:30 PM
if nw>= time1 or nw <= time2:
print "yes, within the interval"
Пожалуйста, дайте мне знать, если это правильный подход, можно ли лучше написать?
Ответы
Ответ 1
Мой первоначальный ответ был очень конкретно сфокусирован на поставленном вопросе и не учитывал интервалы времени, охватывающие полночь. Поскольку это все еще принятый ответ 6 лет спустя, я включил ответ @rouble ниже, который расширил мой, чтобы поддержать полночь.
from datetime import datetime, time
def is_time_between(begin_time, end_time, check_time=None):
# If check time is not given, default to current UTC time
check_time = check_time or datetime.utcnow().time()
if begin_time < end_time:
return check_time >= begin_time and check_time <= end_time
else: # crosses midnight
return check_time >= begin_time or check_time <= end_time
# Original test case from OP
is_time_between(time(10,30), time(16,30))
# Test case when range crosses midnight
is_time_between(time(22,0), time(4,00))
Я по-прежнему придерживаюсь своего первоначального комментария ниже, что большинство приложений этой логики, вероятно, будет лучше подходить для объектов datetime
, где пересечение полуночи в любом случае отражается как изменение даты.
Ответ 2
Принятое решение не работает с ночными часами:
def isNowInTimePeriod(startTime, endTime, nowTime):
if startTime < endTime:
return nowTime >= startTime and nowTime <= endTime
else: #Over midnight
return nowTime >= startTime or nowTime <= endTime
Ответ 3
здесь маленький пример для ответа @rouble:
from datetime import datetime
def isNowInTimePeriod(startTime, endTime, nowTime):
if startTime < endTime:
return nowTime >= startTime and nowTime <= endTime
else: #Over midnight
return nowTime >= startTime or nowTime <= endTime
timeStart = '3:00PM'
timeEnd = '11:00AM'
timeNow = '2:59AM'
timeEnd = datetime.strptime(timeEnd, "%I:%M%p")
timeStart = datetime.strptime(timeStart, "%I:%M%p")
timeNow = datetime.strptime(timeNow, "%I:%M%p")
print(isNowInTimePeriod(timeStart, timeEnd, timeNow))
Ответ 4
Можно упростить дальше:
def isNowInTimePeriod(startTime, endTime, nowTime):
if startTime < endTime:
return startTime <= nowTime <= endTime
else: #Over midnight
return nowTime >= startTime or nowTime <= endTime
Ответ 5
Посмотрите в пакете py-time -ween: https://pypi.org/project/py-time-between/
Тестовые случаи:
from datetime import time
from timebetween import is_time_between
def test_is_time_between():
t, s, e = time(0), time(0), time(0)
assert is_time_between(t, s, e)
t, s, e = time(0, 0, 0, 1), time(0), time(0, 0, 0, 2)
assert is_time_between(t, s, e)
t, s, e = time(0, 0, 0, 1), time(0, 0, 0, 1), time(0, 0, 0, 2)
assert is_time_between(t, s, e)
t, s, e = time(0, 0, 0, 2), time(0, 0, 0, 1), time(0, 0, 0, 2)
assert is_time_between(t, s, e)
t, s, e = time(0, 0, 1), time(23, 59, 59), time(0, 0, 2)
assert is_time_between(t, s, e)
t, s, e = time(12, 0, 0), time(23, 59, 59), time(0, 0, 0)
assert is_time_between(t, s, e)
t, s, e = time(23, 59, 57), time(23, 59, 59), time(23, 59, 57)
assert is_time_between(t, s, e)
t, s, e = time(23, 59, 58), time(23, 59, 59), time(23, 59, 57)
assert not is_time_between(t, s, e)
t, s, e = time(22), time(22), time(5, 59, 59)
assert is_time_between(t, s, e)