horas - ¿Cómo puedo determinar si la hora actual está dentro de un rango específico usando el módulo datetime de Python?
formato fecha python (4)
¿Cuál sería la mejor manera de ver si la hora actual es entre las 10:30 AM
y las 4:30 PM
.
Podría pensar en lo siguiente, no estoy seguro de qué tan correcto:
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"
Por favor, hágame saber si este es el enfoque correcto, ¿se puede escribir algo mejor?
Aquí hay un pequeño ejemplo para la respuesta de @ 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))
Eche un vistazo en el paquete py-time-between: https://pypi.org/project/py-time-between/
Casos de prueba:
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)
La solución aceptada no funciona con los tiempos de la noche:
def isNowInTimePeriod(startTime, endTime, nowTime):
if startTime < endTime:
return nowTime >= startTime and nowTime <= endTime
else: #Over midnight
return nowTime >= startTime or nowTime <= endTime
Mi respuesta original se centró muy específicamente en la pregunta planteada y no se ajustaba a los rangos de tiempo que abarcaban la medianoche. Como esta es todavía la respuesta aceptada 6 años después, he incorporado la respuesta de @rouble a continuación que se expandió en la mía para soportar la medianoche.
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))
Sigo manteniendo mi comentario original a continuación, de que la mayoría de las aplicaciones de esta lógica probablemente se adaptarían mejor a los objetos de datetime
y datetime
, donde el cruce de la medianoche se refleja como un cambio de fecha de todos modos.