web-dev-qa-db-fra.com

Comment puis-je déterminer si l'heure actuelle se situe dans une plage spécifiée à l'aide du module datetime de Python?

Quelle serait la meilleure façon de voir si l'heure actuelle se situe entre say 10:30 AM et 4:30 PM.

Je pourrais penser à ce qui suit, je ne sais pas dans quelle mesure:

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"

Veuillez me faire savoir si c'est la bonne approche, peut-on écrire mieux?

27
user993563

Ma réponse originale se concentrait très précisément sur la question telle qu'elle était posée et ne tenait pas compte des plages de temps qui s'étendent à minuit. Comme c'est toujours la réponse acceptée 6 ans plus tard, j'ai incorporé la réponse de @ rouble ci-dessous qui s'est développée sur la mienne pour prendre en charge minuit.

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

Je reste fidèle à mon commentaire d'origine ci-dessous selon lequel la plupart des applications de cette logique seraient probablement mieux adaptées aux objets datetime où le passage à minuit se reflète de toute façon comme un changement de date.

55
Joe Holloway

La solution acceptée ne fonctionne pas avec les heures de nuit:

def isNowInTimePeriod(startTime, endTime, nowTime):
    if startTime < endTime:
        return nowTime >= startTime and nowTime <= endTime
    else: #Over midnight
        return nowTime >= startTime or nowTime <= endTime
32
rouble

voici un petit exemple pour la réponse 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))
6
Maulik Gangani