为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

牛魔王的故事 2021-09-02 15:01:20
我正在用 Python 实现一些计划任务。主程序 24/7 全天候运行,它以类似于 cron 的方式运行单个任务。我需要确定是否应该多次再次运行任务。在这种情况下,我将获得上次运行任务的时间、当前时间(均作为 Unix 时间戳,通过获取datetime.datetime.utcnow().timestamp()并轻松转换为datetime.datetime对象)以及计划时间(例如,每小时每 15 分钟一次,例如0:15,1:15, ..., 23:15)。我想确定是否有任何预定时间在上次运行时间和当前时间之间,可能是布尔值。保证安排的时间总是“时间”(例如“2:00”)并且不涉及“日期”(例如任何一个月的第一天或任何星期一)。示例数据:import datetimescheduled = [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 wantassert some_method(scheduled, previous, falsey) is Falseassert some_method(scheduled, previous, truthy) is True这里有一些我也想介绍的特殊情况scheduled = [datetime.time(1, 0)]  # 1:00 AMprevious = datetime.datetime(2018, 11, 30, 23)truthy = datetime.datetime(2018, 12, 1, 2, 0)falsey = datetime.datetime(2018, 12, 1, 0, 30)assert some_method(scheduled, previous, falsey) is Falseassert some_method(scheduled, previous, truthy) is True上面的例子应该是True因为预定时间“1 AM”介于“11月30日晚上11点”和“12月1日凌晨2点”之间。我无法直接比较时间,因为“凌晨 1 点”不在同一天的“凌晨 2 点”和“晚上 11 点”之间,而是在不同日期的两个时间之间。
查看完整描述

2 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

如何使用timedelta和比较timetuples?


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


查看完整回答
反对 回复 2021-09-02
  • 2 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信