排序调度事件 Python
我有一系列事件,类似于闹钟。每个事件都有开始和结束时间(以小时和分钟表示),还有一段时间范围(比如1-3,表示从星期天到星期三),以及一个月份范围(比如1-3,表示从一月到三月)。这些数据的格式基本上是固定的。我需要做的不是排序这个列表,而是根据当前时间找到下一个即将发生的事件。这个问题有很多不同的解决方法,还有很多特殊情况需要考虑。这是我的伪代码:
now = time()
diff = []
# Start difference between now and start times
for s in schedule #assuming appending to diff
diff.minutes = s.minutes - time.minutes #
diff.hours = s.hours - time.hours
diff.days = s.days - time.days
diff.months = s.months - time.months
for d in diff
if d < 0
d = period + d
# period is the maximum period of the attribute. ie minutes is 60, hours is 24
# repeat for event end times
现在我有一个包含小时、分钟、天数和周数差异的元组列表。这个元组已经考虑到了是否超过了开始时间,但还没有超过结束时间。比如说现在是八月,而事件的开始月份是七月,结束月份是九月,那么diff.month == 0
。
现在这个特定的特殊情况让我很困扰:
假设一个日程安排在八月的每个星期四从0点到23:59运行。而今天是27号星期五。根据我的算法,月份的差异会是0,但实际上它要到明年八月才会再次运行,所以应该是12。我卡住了。我觉得问题主要出在月份上,因为月份是唯一一个直接依赖于具体日期的属性(而不仅仅是天数)。我的算法可以吗?我可以处理这个特殊情况吗?还是说有更好的解决方案?
这是我正在处理的数据:
map['start_time']=''
map['end_time']=''
map['start_moy']=''
map['end_moy']=''
map['start_dow']=''
map['end_dow']=''
getAllSchedules方法会返回所有日程安排的列表。我可以修改日程安排的类,但不太确定能做出什么改变。我不能添加或更改我得到的日程安排的格式。
4 个回答
因为你的时间单位是分钟,而且假设你没有很多事件,那么我建议每分钟检查一次所有事件。
先把你的事件筛选一下,得到一个新列表,这个列表里的事件时间范围要和当前的月份和日期一致。
然后,对于这些事件,判断它们是“激活”还是“未激活”,这取决于当前时间是否在事件的时间范围内。
把日程表里的项目转换成 日期时间 对象。然后你就可以很简单地对它们进行排序了。
from datetime import datetime
events = sorted(datetime(s.year, s.month, s.day, s.hour, s.minute) for s in schedule)
我不知道怎么仅用日期时间来实现这个功能。不过我找到一个模块,使用了它。效果非常好。