基本上,我希望我的脚本在凌晨4点到5点之间暂停。到目前为止,我想出的唯一方法就是:
seconds_into_day = time.time() % (60*60*24)
if 60*60*4 < seconds_into_day < 60*60*5:
sleep(time_left_till_5am)
任何“正确”的方式吗? Aka一些用于计算时间的内置函数/ lib;而不是一直只使用秒?
答案 0 :(得分:3)
您需要datetime
datetime模块提供了以简单和复杂的方式操作日期和时间的类
如果您使用date.hour
中的datetime.now()
,您将获得当前时间:
datetimenow = datetime.now();
if datetimenow.hour in range(4, 5)
sleep(time_left_till_5am)
您可以通过将time_left_till_5am
乘以60并添加到60 - datetimenow.minute
来计算60 - datetimenow.second
。
答案 1 :(得分:2)
Python有一个内置的日期时间库:http://docs.python.org/library/datetime.html
这可能会让你得到你想要的东西:
import datetime as dt
from time import sleep
now = dt.datetime.now()
if now.hour >= 4 andnow.hour < 5:
sleep((60 - now.minute)*60 + (60 - now.second))
好的,上面的工作,但这里是更纯粹,更不容易出错的解决方案(以及我最初的想法,但突然忘记了怎么做):
import datetime as dt
from time import sleep
now = dt.datetime.now()
pause = dt.datetime(now.year, now.month, now.day, 4)
start = dt.datetime(now.year, now.month, now.day, 5)
if now >= pause and now < start:
sleep((start - now).seconds)
这就是我原来的“timedelta”评论的来源 - 你从减去两个日期时间对象得到的是一个timedelta对象(在这种情况下我们从中拉出'seconds'属性)。
答案 2 :(得分:1)
以下代码涵盖了脚本在任何固定窗口持续时间不足24小时内需要暂停的更一般情况。示例:必须在晚上11:00到01:00之间睡觉。
import datetime as dt
def sleep_duration(sleep_from, sleep_to, now=None):
# sleep_* are datetime.time objects
# now is a datetime.datetime object
if now is None:
now = dt.datetime.now()
duration = 0
lo = dt.datetime.combine(now, sleep_from)
hi = dt.datetime.combine(now, sleep_to)
if lo <= now < hi:
duration = (hi - now).seconds
elif hi < lo:
if now >= lo:
duration = (hi + dt.timedelta(hours=24) - now).seconds
elif now < hi:
duration = (hi - now).seconds
return duration
tests = [
(4, 5, 3, 30),
(4, 5, 4, 0),
(4, 5, 4, 30),
(4, 5, 5, 0),
(4, 5, 5, 30),
(23, 1, 0, 0),
(23, 1, 0, 30),
(23, 1, 0, 59),
(23, 1, 1, 0),
(23, 1, 1, 30),
(23, 1, 22, 30),
(23, 1, 22, 59),
(23, 1, 23, 0),
(23, 1, 23, 1),
(23, 1, 23, 59),
]
for hfrom, hto, hnow, mnow in tests:
sfrom = dt.time(hfrom)
sto = dt.time(hto)
dnow = dt.datetime(2010, 7, 5, hnow, mnow)
print sfrom, sto, dnow, sleep_duration(sfrom, sto, dnow)
这是输出:
04:00:00 05:00:00 2010-07-05 03:30:00 0
04:00:00 05:00:00 2010-07-05 04:00:00 3600
04:00:00 05:00:00 2010-07-05 04:30:00 1800
04:00:00 05:00:00 2010-07-05 05:00:00 0
04:00:00 05:00:00 2010-07-05 05:30:00 0
23:00:00 01:00:00 2010-07-05 00:00:00 3600
23:00:00 01:00:00 2010-07-05 00:30:00 1800
23:00:00 01:00:00 2010-07-05 00:59:00 60
23:00:00 01:00:00 2010-07-05 01:00:00 0
23:00:00 01:00:00 2010-07-05 01:30:00 0
23:00:00 01:00:00 2010-07-05 22:30:00 0
23:00:00 01:00:00 2010-07-05 22:59:00 0
23:00:00 01:00:00 2010-07-05 23:00:00 7200
23:00:00 01:00:00 2010-07-05 23:01:00 7140
23:00:00 01:00:00 2010-07-05 23:59:00 3660
答案 3 :(得分:0)
在处理Python中的日期和时间时,我仍然比Python的datetime模块更喜欢mxDateTime,因为虽然内置的多年来已经有了很大的改进,但它仍然相当笨拙且缺乏比较。所以,如果有兴趣请到这里:mxDateTime可以免费下载和使用。在处理日期时间数学时,可以使生活更轻松。
import mx.DateTime as dt
from time import sleep
now = dt.now()
if 4 <= now.hour < 5:
stop = dt.RelativeDateTime(hour=5, minute=0, second=0)
secs_remaining = ((now + stop) - now).seconds
sleep(secs_remaining)