获取特定间隔的计划事件



我有一系列事件,根据它们的发生频率设置,例如,每周(如每周二(、每月(每秒钟一次(等。事件序列有一个开始日期,可以指定或省略结束日期。

例如:

event = Event(
name='go to the office', 
startday='13.10.2020', 
schedule=Schedule(type='weekly', details={'day':'Tuesday'})
)

这只是一个示例界面,如果工具需要,可以对其进行调整

任务本身就是我需要进行一个具有特定开始-结束时间间隔的查询,并获取该间隔中的所有事件。

因此,问题是,有没有图书馆可以解决这些问题,或者我必须重新发明轮子?

我必须在基于Django的项目中进行,所以如果基于Djano的解决方案更方便的话。

我自己用python dateutil的rrule找到了一个有效的解决方案它可以创建重复(重复(事件,并使用between((方法从中进行查询。

# pip install python-dateutil
from functools import reduce
from operator import itemgetter
from datetime import datetime
from dateutil.rrule import (
rrule,
WEEKLY,
DAILY,
MO, TU, WE, TH, FR, SA, SU
)
events = [
{
'type': 'task',
'rule': rrule(
WEEKLY,
dtstart=datetime(year=2020, month=10, day=13),
),
'name': 'Clean room'
},
{
'type': 'party',
'rule': rrule(
WEEKLY,
dtstart=datetime(year=2020, month=10, day=13),
until=datetime(year=2020, month=12, day=13),
byweekday=(SA, SU), wkst=MO,
),
'name': 'Dance',
'participants': ['Willy', 'Sue'],
},
{
'type': 'meditation',
'rule': rrule(
DAILY,
interval=2,
dtstart=datetime(year=2020, month=10, day=13),
until=datetime(year=2020, month=12, day=13)
),
'name': 'Think out',
'location': 'outside',
},
]

def main():
all_events = timeline(
events,
startday=datetime(year=2010, month=1, day=1),
endday=datetime(year=2020, month=11, day=1)
)
print('Timelinen---')
for event in all_events:
print_event(event)

def timeline(events, startday, endday):
all_events = reduce(
lambda all_events, event:
all_events + events_list(event, startday, endday),
events,
[]
)
return sorted(all_events, key=itemgetter('date'))

def events_list(event, startday, endday):
dates = event['rule'].between(startday, endday, inc=True)
inner_events = [{'date': date, 'event': event} for date in dates]
return inner_events

def print_event(event):
print(
f'{event["date"]}: {event["event"]["name"]} ({event["event"]["type"]})'
)

if __name__ == "__main__":
main()

输出:

Timeline
---
2020-10-13 00:00:00: Clean room (task)
2020-10-13 00:00:00: Think out (meditation)
2020-10-15 00:00:00: Think out (meditation)
2020-10-17 00:00:00: Dance (party)
2020-10-17 00:00:00: Think out (meditation)
2020-10-18 00:00:00: Dance (party)
2020-10-19 00:00:00: Think out (meditation)
2020-10-20 00:00:00: Clean room (task)
2020-10-21 00:00:00: Think out (meditation)
2020-10-23 00:00:00: Think out (meditation)
2020-10-24 00:00:00: Dance (party)
2020-10-25 00:00:00: Dance (party)
2020-10-25 00:00:00: Think out (meditation)
2020-10-27 00:00:00: Clean room (task)
2020-10-27 00:00:00: Think out (meditation)
2020-10-29 00:00:00: Think out (meditation)
2020-10-31 00:00:00: Dance (party)
2020-10-31 00:00:00: Think out (meditation)
2020-11-01 00:00:00: Dance (party)

最新更新