6

如果当前时间在两个端点之间(例如,上午 8:30 和下午 3:00),我想检查 python,而不管实际日期如何。如,我不在乎完整日期是什么;只是一个小时。当我创建用于指定时间的datetime对象strptime时,它输入了一个虚拟日期(我认为是 1900 年?),这不是我想要的。我可以使用像这样笨拙的布尔表达式,(hour == 8 and minute >= 30) or (9 <= hour < 15)但这似乎不是很优雅。完成此任务的最简单和最 Pythonic 的方法是什么?

进一步扩展一点,我真正想要的是能告诉我它是否在那个时间范围之间,以及它是工作日的东西。当然我可以0 <= weekday() <= 4用来破解这个,但可能有更好的方法。

4

4 回答 4

17

datetime对象有一个调用的方法time(),它返回一个time对象(没有日期信息)。然后,您可以time使用法线<>运算符比较对象。

import datetime
import time
timestamp = datetime.datetime.now().time() # Throw away the date information
time.sleep(1)
print (datetime.datetime.now().time() > timestamp) # >>> True (unless you ran this one second before midnight!)

# Or check if a time is between two other times
start = datetime.time(8, 30)
end = datetime.time(15)
print (start <= timestamp <= end) # >>> depends on what time it is

如果您还想检查工作日,您建议的代码可能是最有效的方法,但在这种情况下,您可能不想丢弃原始datetime对象。

now = datetime.datetime.now()
if 0 <= now.weekday() <= 4:
    print ("It's a weekday!")
print (start <= now.time() <= end) # with start & end defined as above
于 2013-09-18T23:34:05.640 回答
2
from datetime import datetime, time
now = datetime.now()
if 0 <= now.weekday() <= 4:
    print "it's a weekday"
    if time(8, 30) <= now.time() <= time(15):
        print "and it's in range"
于 2013-09-18T23:37:28.510 回答
2
>>> import datetime
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2013, 9, 19, 3, 39, 38, 459765)
>>> 0 <= now.weekday() <= 4
True
>>> datetime.time(hour=8, minute=30) <= now.time() <= datetime.time(hour=15)
False
于 2013-09-18T23:38:05.650 回答
0

我不知道您是如何获得开始和结束时间的,但如果您将其限制为一天,请确保开始时间在结束时间之前。例如,如果您有开始时间 = 1800 和结束时间 = 1200,那么您将找不到那一天之间的任何时间。

于 2013-09-18T23:56:16.660 回答