如何使用Python的datetime模块确定当前时间是否在指定范围内?

use*_*563 28 python python-datetime

什么是最好的方式来看看当前时间是否介于说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"
Run Code Online (Sandbox Code Playgroud)

请告诉我,如果这是正确的方法,可以写出更好的东西吗?

Joe*_*way 57

我的原始答案非常专注于所提出的问题,并且不适应跨越午夜的时间范围.因为这仍然是6年后接受的答案,我已经将@ ruble的答案纳入了我的扩展,以支持午夜.

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))
Run Code Online (Sandbox Code Playgroud)

我仍然坚持下面我原来的评论,这个逻辑的大多数应用可能更适合于datetime过夜午夜反映为日期变化的对象.

  • 也应该使用:`if time(10,30)<= now.time()<= time(16,30):`. (11认同)
  • 但是如果你想检查时间是否在晚上10点到凌晨4点之间怎么办?:-) (6认同)
  • @卢布的解决方案更为通用.此解决方案仅在`start_time <end_time`时有效,如果您的时段在前一天的午夜之前开始,则该情况不正确.(例如,晚上11点开始,凌晨5点结束,晚上11点>早上5点) (2认同)

rou*_*ble 34

已接受的解决方案不适用于夜间:

def isNowInTimePeriod(startTime, endTime, nowTime):
    if startTime < endTime:
        return nowTime >= startTime and nowTime <= endTime
    else: #Over midnight
        return nowTime >= startTime or nowTime <= endTime
Run Code Online (Sandbox Code Playgroud)

  • 好的解决方案 请注意,startTime,endTime和nowTime是时间对象,您可以使用`datetime.time()访问datetime对象的时间部分. (3认同)
  • 怎么大家都错过了! (3认同)

EVE*_*ano 8

我的 2 美分,它对我有用,而且很简单

while True:
    now = datetime.now()
    current_time = now.strftime("%H:%M:%S")
    start = '19:19:00'
    end = '19:19:20'
    if current_time > start and current_time < end:
        print('in')
        print(current_time)
        tempo.sleep(1)
    else:
        print('out')
        print(current_time)
Run Code Online (Sandbox Code Playgroud)


Mau*_*ani 7

这是@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))
Run Code Online (Sandbox Code Playgroud)