Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python检查白天_Python_Datetime_Time - Fatal编程技术网

Python检查白天

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

基本上,我希望我的脚本在凌晨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<第二天<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)