延迟任务直到某个时间

Mar*_*ark 10 python time datetime

我想在python脚本中做的是睡几秒钟,直到达到所需的时间.IE:如果runAt设置是15:20,当前时间是10:20,我该如何计算出睡多少秒?我不确定如何将15:20转换为时间和当前日期,然后扣除实际时间来获得秒数.

Mik*_*ame 11

如果从另一个中减去一个日期时间对象,则会得到一个具有秒属性的timedelta对象,因此您可以执行以下操作:

t1 = datetime.datetime.now()

# other stuff here
t2 = datetime.datetime.now()
delta = t2 - t1
if delta.seconds > WAIT:
    # do stuff
else:
    # sleep for a bit
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您可能希望将cron用于应该在特定时间运行的任务.


Art*_*nka 11

认为你也可以使用以下代码:

from datetime import datetime, time
from time import sleep

def act(x):
    return x+10

def wait_start(runTime, action):
    startTime = time(*(map(int, runTime.split(':'))))
    while startTime > datetime.today().time(): # you can add here any additional variable to break loop if necessary
        sleep(1)# you can change 1 sec interval to any other
return action

wait_start('15:20', lambda: act(100))
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以改为使用pause包 [ https://pypi.python.org/pypi/pause/0.1.2 ]。以他们的文档为例 -

import pause, datetime
dt = datetime.datetime(2013, 6, 2, 14, 36, 34, 383752)
pause.until(dt)
Run Code Online (Sandbox Code Playgroud)

  • [它不适用于 Windows](https://github.com/jgillick/python-pause/issues/1)。 (2认同)

jab*_*bba 5

使用 timedelta 对象是要走的路。以下是对我有用并且可以轻松调整到任何其他时间的示例:

import datetime, time
today = datetime.datetime.now()

sleep = (datetime.datetime(today.year, today.month, today.day, 15, 20, 0) - today).seconds
print('Waiting for ' + str(datetime.timedelta(seconds=sleep)))
time.sleep(sleep)
Run Code Online (Sandbox Code Playgroud)

考虑到如果 15:20 已经过去,这个减法仍然有效并且会等到下一次出现 15:20,因为在这种情况下 timedelta 返回一个负天数。现在是 16:15,因为我正在运行我的代码:

print(datetime.datetime(today.year, today.month, today.day, 15, 20, 0) - today)
>>>-1 day, 23:05:00.176033
Run Code Online (Sandbox Code Playgroud)