如何在Python中比较时间?


98

我看到可以进行日期比较,也可以进行日期比较datetime.timedelta(),但是我正在努力寻找如何检查当前时间(datetime.datetime.now())是否早于指定时间(晚于或晚于指定时间)(例如,上午8点),而不管日期如何。


1
我不确定将其作为答案,但我将其作为注释:令人惊讶的是,我发现Python接受像'23:23:00' > '23:59:00''23:23:00' > '23:09:22'那样的比较,就像您在两个datetime.datetime.now().strftime('%H:%M')值之间所做的一样。这是实现时间之间比较的最好方法吗?我不知道。它行得通吗?据我测试,它工作正常。但绝对(当然):没有机会将其与具有月份,工作日的日期时间字符串一起使用。
ivanleoncz

Answers:


128

无法将特定时间点(例如“现在”)与一个固定的重复事件(每天早上8点发生)进行比较。

您可以检查现在是在今天上午8点之前还是之后:

>>> import datetime
>>> now = datetime.datetime.now()
>>> today8am = now.replace(hour=8, minute=0, second=0, microsecond=0)
>>> now < today8am
True
>>> now == today8am
False
>>> now > today8am
False

4
您可能希望将接受转移到韦尔斯兰德(PärWieslander)的答案上(通常应比:P多等待几分钟),因为这与您的要求更加具体。

65

您可以使用对象的time()方法datetime来获取一天中的时间,您可以将其用于比较而无需考虑日期:

>>> this_morning = datetime.datetime(2009, 12, 2, 9, 30)
>>> last_night = datetime.datetime(2009, 12, 1, 20, 0)
>>> this_morning.time() < last_night.time()
True

2
确保这样做datetime.datetime.now().time(),不要忘记括号now()
Jose Salvatierra

10

您可以直接比较datetime.datetime对象

例如:

>>> a
datetime.datetime(2009, 12, 2, 10, 24, 34, 198130)
>>> b
datetime.datetime(2009, 12, 2, 10, 24, 36, 910128)
>>> a < b
True
>>> a > b
False
>>> a == a
True
>>> b == b
True
>>> 

4

受到Roger Pate的启发:

import datetime
def todayAt (hr, min=0, sec=0, micros=0):
   now = datetime.datetime.now()
   return now.replace(hour=hr, minute=min, second=sec, microsecond=micros)    

# Usage demo1:
print todayAt (17), todayAt (17, 15)

# Usage demo2:    
timeNow = datetime.datetime.now()
if timeNow < todayAt (13):
   print "Too Early"

2

另一种不添加依赖项或不使用datetime的方法是对time对象的属性进行一些数学运算。它具有小时,分钟,秒,毫秒和时区。对于非常简单的比较,小时和分钟应该足够了。

d = datetime.utcnow()
t = d.time()
print t.hour,t.minute,t.second

除非您有一个非常简单的用例,否则我不建议您这样做。对于需要时区感知或日期感知的任何事物,都应使用datetime。


1

日期时间具有比较能力

>>> import datetime
>>> import time
>>> a =  datetime.datetime.now()
>>> time.sleep(2.0)
>>> b =  datetime.datetime.now()
>>> print a < b
True
>>> print a == b
False


1

您可以将Timedelta函数用于x时间增加比较。

>>> import datetime 

>>> now = datetime.datetime.now()
>>> after_10_min = now + datetime.timedelta(minutes = 10)
>>> now > after_10_min 

False

这些答案的结合罗杰

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.