我想在python脚本中做的是休眠几秒钟,直到达到所需的时间。IE:如果runAt设置为15:20,当前时间为10:20,我如何计算睡眠时间?我不确定如何将15:20转换为时间和当前日期,然后扣除实际时间以获得秒。
认为还可以使用以下代码:
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))
如果你从一个datetime对象减去另一个datetime对象,你会得到一个timedelta对象,它有一个seconds属性,所以你可以这样做:
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。
您可以使用pause
包(https://pypi.python.org/pypi/pause)。从他们的文档中取一个例子-
import pause, datetime
dt = datetime.datetime(2013, 6, 2, 14, 36, 34, 383752)
pause.until(dt)
使用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
除了使用sleep(X)函数,还可以使用to来设置Timer
这取决于你打算做什么。
下面是一个使用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)
这是一个解决方案。这与日期无关,因为新的日期时间"end2"与当前日期时间具有相同的日期,同时日期时间格式没有更改。
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())
同时使用箭头和暂停:
maintenance = arrow.now()
EndAt = maintenance.replace(hour = 17, minute = 6, second = 0)
print(maintenance,': Maintenance in progress. Pausing until :',EndAt)
pause.until(EndAt.naive)