Python检查白天
基本上,我希望我的脚本在凌晨4点到5点之间暂停。到目前为止,我提出的唯一方法是:Python检查白天,python,datetime,time,Python,Datetime,Time,基本上,我希望我的脚本在凌晨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) seconds\u in\u day=time.time()%(60*60*24) 如果60*60*4
seconds_into_day = time.time() % (60*60*24)
if 60*60*4 < seconds_into_day < 60*60*5:
sleep(time_left_till_5am)
seconds\u in\u day=time.time()%(60*60*24)
如果60*60*4<第二天<60*60*5:
睡眠时间(离开时间到凌晨5点)
有什么“正确”的方法可以做到这一点吗?Aka一些用于计算时间的内置函数/lib;而不是一直使用秒数?你想要什么
datetime模块提供用于以简单和复杂方式操作日期和时间的类
如果使用datetime.now()中的date.hour
,您将获得当前小时数:
datetimenow = datetime.now();
if datetimenow.hour in range(4, 5)
sleep(time_left_till_5am)
您可以通过将60-datetimenow.minute
乘以60并添加到60-datetimenow.second
time\u到凌晨5点的时间
这可能会让你得到你想要的:
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))
将日期时间导入为dt
从时间上导入睡眠
now=dt.datetime.now()
如果now.hour>=4且now.hour<5:
睡眠((60-现在。分钟)*60+(60-现在。秒))
好的,上面的方法是有效的,但这里有一个更纯粹、更不容易出错的解决方案(我最初的想法是,但突然忘记了怎么做):
将日期时间导入为dt
从时间上导入睡眠
now=dt.datetime.now()
pause=dt.datetime(now.year,now.month,now.day,4)
开始=日期时间(now.year,now.month,now.day,5)
如果现在>=暂停,现在<开始:
睡眠((立即开始)。秒)
这就是我最初的“timedelta”注释的来源——减去两个datetime对象得到的是一个timedelta对象(在本例中,我们从中提取“秒”属性)。下面的代码涵盖了脚本需要在任何持续时间少于24小时的固定窗口内暂停的更一般情况。示例:必须在晚上11:00到凌晨1: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)
在Python中处理日期和时间时,我仍然更喜欢mxDateTime而不是Python的datetime模块,因为尽管内置模块多年来有了很大的改进,但它仍然相当笨拙,缺乏比较。因此,如果有兴趣,请点击这里:免费下载和使用。在处理日期时间数学时,使生活变得更加轻松
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)
将mx.DateTime导入为dt
从时间上导入睡眠
now=dt.now()
如果4 Yeah在我发布我的问题之前在谷歌上搜索了一下,我仍然想不出一个方法如何将它用于我的目的。有机会举个例子吗?timedelta和datetime对象是否具有可比性o@Robus:现在我已经仔细考虑了,更新了您可能真正想要做的事情。@OP,@answerer,@upvoctors:FAIL。你一定是在开玩笑;如果“现在”是午夜到凌晨4点之间的任何时间,它就会睡着。。。考虑一下<代码>如果停顿,约翰:好伤心,多放在你的肩膀上?我并不认为一次意外的反向测试会导致失败。@John:我也没有在任何地方部署代码,我只是想帮助别人。你本可以指出细微的错误并赢得大家的感谢,但你选择了添加侮辱并否决了一个完全有用的答案。
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
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)