Python检查日期时间

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)

有没有“正确”的方法来做到这一点?是否有一些内置的函数/库可以用于计算时间,而不仅仅是一直使用秒数?
4个回答

3

您想使用datetime

datetime模块提供了简单和复杂的日期和时间操作类。

如果您从 datetime.now() 使用 date.hour,则会得到当前小时:

datetimenow = datetime.now();
if datetimenow.hour in range(4, 5)
    sleep(time_left_till_5am)

你可以通过以下步骤计算 time_left_till_5am:取 60 - 当前分钟数,乘以60,再加上60 - 当前秒数

我在发布问题之前已经谷歌过了,但是我仍然想不出如何将其用于我的目的。有没有示例可以参考一下? - Robus

2

Python内置了datetime库: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”评论的来源——从两个日期时间对象相减所得到的是一个时间差对象(在这种情况下,我们提取'seconds'属性)。

@Robus:现在我想了想,更新了你可能真正想做的事情。 - Nicholas Knight
@OP,@回答者,@点赞者:失败。你一定是在开玩笑吧;如果“现在”是午夜到凌晨4点之间的任何时间,那么它就会让程序进入睡眠模式......请考虑if pause <= now < start: - John Machin
@John:天哪,你有点过于敏感了吧?因为一个意外倒置的测试而被贴上“FAIL”的标签和遭受负面评价,这不是我所理解的礼貌待人之道。 - Nicholas Knight
@John:我也没有在任何地方部署代码,我只是想帮助别人。你本可以指出微小的错误并赢得大家的感谢,但你选择添加侮辱性言论并对一份非常有帮助的答案进行了负面评价。 - Nicholas Knight
@John:建议你阅读常见问题解答,特别是“友善待人”部分。 - Nicholas Knight
显示剩余3条评论

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

0
在 Python 中处理日期和时间时,我仍然更喜欢 mxDateTime 而不是 Python 的 datetime 模块。尽管内置的模块在多年的改进后已经有了很大的提升,但它与 mxDateTime 相比仍然相对笨拙和缺乏灵活性。因此,如果您感兴趣,请单击 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接