排序调度事件 Python

1 投票
4 回答
1727 浏览
提问于 2025-04-16 02:43

我有一系列事件,类似于闹钟。每个事件都有开始和结束时间(以小时和分钟表示),还有一段时间范围(比如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 个回答

1

因为你的时间单位是分钟,而且假设你没有很多事件,那么我建议每分钟检查一次所有事件。

先把你的事件筛选一下,得到一个新列表,这个列表里的事件时间范围要和当前的月份和日期一致。

然后,对于这些事件,判断它们是“激活”还是“未激活”,这取决于当前时间是否在事件的时间范围内。

1

把日程表里的项目转换成 日期时间 对象。然后你就可以很简单地对它们进行排序了。

from datetime import datetime
events = sorted(datetime(s.year, s.month, s.day, s.hour, s.minute) for s in schedule)
0

我不知道怎么仅用日期时间来实现这个功能。不过我找到一个模块,使用了它。效果非常好。

http://labix.org/python-dateutil

撰写回答