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

2024-04-28 21:27:15 发布

您现在位置:Python中文网/ 问答频道 /正文

如果当前时间介于10:30 AM4: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"

请让我知道如果这是正确的方法,可以写一些更好的吗?


Tags: 方法datetimethisamtimedeltastsecondszero
3条回答

公认的解决方案不适用于过夜时间:

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

下面是@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年后被接受的答案,我在下面加入了@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对象,在这些对象中,无论如何,跨越午夜都会反映为日期更改。

相关问题 更多 >