我正在用 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
添加回答
舉報
0/150
提交
取消