延迟任务直到某个时间

时间:2011-07-05 07:17:20

标签: python datetime time

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

8 个答案:

答案 0 :(得分: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))

答案 1 :(得分:10)

如果从另一个中减去一个datetime对象,则会得到一个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

另外,您可能希望将cron用于应该在特定时间运行的任务。

答案 2 :(得分:4)

您可以改为使用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)

答案 3 :(得分:1)

您也可以使用Timer

,而不是使用函数sleep(X)

这取决于你打算做什么。

答案 4 :(得分:1)

这是一个使用Arrow模块的解决方案:

def wait_until(specified_dt: arrow.Arrow) -> None:
"""Stay in a loop until the specified date and time."""
# Initially check every 10 seconds.
refresh = 10
current_dt = arrow.utcnow()

while current_dt < specified_dt:
    # Check every millisecond if close to the specified time.
    current_dt = arrow.utcnow()
    if (specified_dt - current_dt).seconds < 11:
        refresh = .001

    time.sleep(refresh)

答案 5 :(得分:1)

使用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)

请注意,如果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

答案 6 :(得分:0)

这是一个解决方案。这与日期无关,因为新的日期时间&#34; end2&#34;与当前日期时间具有相同的日期,同时日期时间格式不会更改。

from datetime import datetime               #this is the way to import a module named datetime...
import time                                 #this module is used to sleep
import pause

a = (datetime.now())                        #a = '2017-07-27 00:10:00.107000' #for example
print 'the time is'
print a

end2 = a.replace(hour = 15, minute = 20, second = 00)

delta = end2 - a
print delta                                 # prints:  5:00:00
print delta.total_seconds()                 # prints: 114605.0
pause.seconds(delta.total_seconds())

答案 7 :(得分:0)

同时使用箭头和暂停键:

maintenance = arrow.now()
EndAt = maintenance.replace(hour = 17, minute = 6, second = 0)
print(maintenance,': Maintenance in progress. Pausing until :',EndAt)
pause.until(EndAt.naive)