在我维护的Django网站中,我需要检查用户是否每天在特定时间窗口内登录(并执行某项任务)。这些时间窗口是固定的,每天都会重复出现。例如,窗口#1介于 3AM 和 6:30 AM (含)之间,而窗口#2 11:50 AM 和 2:45P M(含)。
每当用户返回网站时,我都会检索time_now = datetime.datetime.now()
。因为我只关心时间,所以我使用time_now.time()
。接下来,我需要检查time_now.time()
是否属于上述任何一个时间窗口。
我不确定如何在python中进行比较。特别是,我如何定义控制时间窗口的时间对象?它会是这样的:
time_now = datetime.datetime.now()
now = time_now.time()
today3am = now.replace(hour=3, minute=0, second=0, microsecond=0)
today630am = now.replace(hour=6, minute=30, second=0, microsecond=0)
if today3am < now < today630am:
#do something
(同样是第二次窗口)。
请告知这是否是正确的方法。或者,更好的方法(性能方面)也是最受欢迎的。
答案 0 :(得分:1)
一些评论。
是的,这是比较日期时间对象的正确方法。 datetime docs表明日期时间对象支持算术运算,乘法运算和比较运算。
我怀疑您上面提供的示例代码是否已投入生产,但您的if
声明在这种情况下是独占的,不像您在问题中提到的那样具有包容性。我也确定你知道如何将其改为包含if语句,但我会将其包含在其他人中。
if today3am <= now <= today630am:
## This is true if now is
## 03:00 or 03:01
性能方面,我不确定你想要多么精细。如果记录时间是您唯一关心的事情,我建议您使用datetime
模块中的time object。这将创建一个没有所有日期数据的对象,使得生成的对象占用较少的RAM,可能会加快比较速度。但是,我认为这两种方法之间的差异可以忽略不计。我将让您对此进行测试,并选择最能支持您目标的方法。
答案 1 :(得分:1)
我认为您不需要在当前时间内替换hour
和minute
。因为您从time()
获得了time_now
,所以您可以将其与另一个time
对象进行比较。
dt_now = datetime.datetime.now()
t_now = dt_now.time()
现在,您需要下限和上限:
t_3am = datetime.time(hour=3, minute=0)
t_630am = datetime.time(hour=6, minute=30)
有了这些,您可以直接比较时间对象:
if t_3am < t_now <= t_630am: # used <= to make the upper bound inclusive
# do something
性能方面,我会说你应该将t_3am
和t_630am
视为常量,因为这些不会改变。因此,更好的方法是只定义一次,而不是每当您获得当前时间时都不断更换hour
和minute
。