Python检查白天

时间:2010-07-04 22:02:21

标签: 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)

任何“正确”的方式吗? Aka一些用于计算时间的内置函数/ lib;而不是一直只使用秒?

4 个答案:

答案 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)