我的日期时间循环不起作用,if time==now 部分不起作用

时间:2021-04-13 12:11:22

标签: python datetime

from twilio.rest import Client
from datetime import datetime

#                                 Twilio Account SID, Auth Token
client = Client("SID", "Token")

while True:
    if (datetime.time(datetime.now())) == '08:00:00.000000':
    client.messages.create(to="+Number", 
                           from_="+Number", 
                           body="Goodmorning")

为什么不是每天早上 8 点执行?如果我从现在开始将其切换为一分钟并让循环运行它不起作用

3 个答案:

答案 0 :(得分:2)

您的代码有两个错误的假设。

datetime.datetime.time(datetime.datetime.now()) 的类型是 datetime.time,而不是 str,并且将 datetime.time 与 str 进行比较将始终返回 False。您应该将 datetime.datetime.time(datetime.datetime.now()) 与 datetime.time(8, 0) 进行比较。

第二个假设是 datetime.now 将在 08:00:00.000000 的确切时间执行,这是可能的,但不太可能。

修正第二个假设的一种方法是设置一个时间窗口,在此期间 if 语句可以为真。


from twilio.rest import Client
from datetime import datetime, timedelta, time, date

# Twilio Account SID, Auth Token
client = Client("SID", "Token")
# calculate the next time window
time_window_start = datetime.combine(date.today() + timedelta(days=1), time(8, 0))
time_window_end = time_window_start + timedelta(hours=1)

while True:
    # check if we are in the time window
    if time_window_start < datetime.now() and datetime.now() < time_window_end:
        client.messages.create(
            to="+Number", from_="+Number", body="Goodmorning")
        # calculate new time window for tomorrow
        time_window_start = datetime.combine(date.today() + timedelta(days=1), time(8, 0))
        time_window_end = time_window_start + timedelta(hours=1)

这段代码会等到8点到9点之间,然后创建一条消息,等到第二天。 我仍然看到 3 个问题。首先是这是busy waiting。您可以通过使用 time.sleep 定期睡眠来解决此问题

<块引用>

busy-waiting 或 spin 是一种技术,在该技术中,进程会反复检查某个条件是否为真。 ...在大多数情况下,旋转被认为是一种反模式,应该避免,因为可用于执行不同任务的处理器时间反而浪费在无用的活动上。在某些情况下,旋转可能是一种有效的策略。

第二个问题是您的代码可能会错过时间窗口。我已将窗口持续时间设置为 1 小时,所以我认为这不会经常发生。但有几种方法可以缓解这种情况。

第三个是窗口开始和结束在两个不同的地方计算。你可以把它放在一个函数中,这样你就Don't repeat yourself

答案 1 :(得分:1)

使用您的代码,即使使用 maney 的答案,也无法正常工作。您的函数必须在 excatly '08:00:00.000000' 处随机调用才能使其正常工作。

看看这个question的答案。

答案 2 :(得分:0)

(datetime.time(datetime.now())) 返回值类似于对象 datetime.time(12, 18, 39, 515846)。 您可以使用 datetime.time(datetime.now()).isoformat() 获取格式为 12:19:29.456461 的时间值。然后您可以使用它在您的 if 循环中进行比较。

例如,

from twilio.rest import Client
from datetime import datetime

#                                 Twilio Account SID, Auth Token
client = Client("SID", "Token")

while True:
    if (datetime.time(datetime.now())).isoformat() == '08:00:00.000000':
    client.messages.create(to="+Number", 
                           from_="+Number", 
                           body="Goodmorning")