1

我需要从我的日期值创建带有 BYDAY 参数的 RRULE 字符串。

有什么自然的方法吗?

我为此目的编写了这个实用程序代码:

import calendar

fweek_fday, mdays = calendar.monthrange(date.year, date.month)
# Get weekday of first day and total days in current month
mweeks = ((mdays+fweek_fday-1)//7)+1
# Get total weeks in current month
mday, wday = date.day, date.weekday()
# Get current day of month and current day as day of a week
week_days = ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']
week = ((mday+fweek_fday-1)//7)+(1 if wday>=fweek_fday else 0)
# Get current week no
week = -1 if week == mweeks else week
wday = week_days[wday]

output = "BYDAY=%d%s" % (week, wday)
4

2 回答 2

1

正如您在评论中所说,我还没有发现任何模块可以从一组约束中排除。如果可能的话,您可以考虑 RDATE 而不是 BYDAY。

您的另一个选择是:

import datetime
(y,w,d ) = date.isocalendar()
#w will be the iso week number, d the day of week
(y2,wb,d2) = datetime.datetime(date.year,date.month,1).isocalendar()
wkcount = 1 if d>=d2 else 0
# you need to account whether your date is a weekday after the one of the first of the month or not
print "BYDAY=%d%s"%(w-wb+wkcount,date.strftime("%a").upper()[0:2])

但是要小心,如果您的规则还包括 WKST

于 2012-11-02T20:35:53.470 回答
0

执行此操作的自然方法(除非您正在编写 iCalendar 库)是使用预先存在的 iCalendar 库作为对象,该库具有处理重复规则等的方法,而不是进行字符串解析和生成。

可能没有这样的库,在这种情况下你就不走运了。但是你应该做的第一件事就是寻找一个。

PyPI上快速搜索会发现许多可能性。第一个iCalendar被描述为“iCalendar 文件的解析器/生成器”,这听起来像是一个不错的候选者。浏览文档,或者只是浏览pip install一下文档,看看它是否能做你想做的事。

于 2012-10-31T21:20:59.887 回答