亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

檢查列表中的任何時間是否在兩個時間戳之間

檢查列表中的任何時間是否在兩個時間戳之間

牛魔王的故事 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 關注
  • 212 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號