检查列表中的任何时间是否介于两个时间戳之间

2024-09-28 20:51:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python实现一些计划任务。主程序全天候运行,它以类似cron的方式运行单个任务。我需要确定任务是否应该从times再次运行。在

在本例中,我将获得任务最后一次运行的时间、当前时间(都是Unix时间戳,通过datetime.datetime.utcnow().timestamp()获得,并且很容易转换为datetime.datetime对象),以及计划时间(例如,每15分钟每小时,比如0:151:1523:15)。我想确定是否有任何调度时间在上次运行时间和当前时间之间,可能是布尔值。保证预定时间始终是“时间”(如“2:00”),不涉及“日期”(如任何月份的第一天或任何星期一)。在

示例数据:

import datetime

scheduled = [datetime.time(h, m) for h, m in [(0, 15), (6, 15), (12, 15), (18, 15)]]
previous = datetime.datetime(2018, 11, 30, 5)
truthy = datetime.datetime(2018, 11, 30, 7)
falsey = datetime.datetime(2018, 11, 30, 6)

# some_method() is what I want
assert some_method(scheduled, previous, falsey) is False
assert some_method(scheduled, previous, truthy) is True

这里有一些特殊情况,我也想介绍一下

^{pr2}$

上面的例子应该是True,因为计划时间“1am”是在“11月30日晚上11点”和“12月1日凌晨2点”之间。我不能直接比较时间,因为“凌晨1点”不是在同一天的“凌晨2点”和“晚上11点”之间,而是在不同日子的两个时间之间。在


Tags: truedatetimeis时间someassertmethodcron
2条回答

使用timedelta并比较timetuple如何?在

def some_method(scheduled, prev, datetime_to_check):
    yesterday = datetime_to_check - datetime.timedelta(days=1)
    schedule = [(*yesterday.timetuple()[:3], s.hour, s.minute) for s in scheduled]
    schedule.extend((*datetime_to_check.timetuple()[:3], s.hour, s.minute) for s in scheduled)
    prev_tup = prev.timetuple()
    check_tup = datetime_to_check.timetuple()
    for scheduled_time in schedule:
        if prev_tup < scheduled_time < check_tup:
            return True
    return False

一个简单的方法似乎是以下函数:

def some_method(scheduled, prev, next):
    date1 = prev.date()
    date2 = next.date()
    if (next - prev).total_seconds() > 86400:
       return True
    for s in scheduled:
        for date in {date1, date2}:
            temp = datetime.datetime(date.year, date.month, date.day, s.hour, s.minute, s.second)
            if prev < temp < next:
                return True
    return False

我会让别人来修饰它,但这似乎很管用。在

相关问题 更多 >