Как отформатировать дату в BYDAY (спецификация iCalendar)
Мне нужно создать строку RRULE с параметром BYDAY из моего значения даты.
Есть ли естественный способ сделать это?
Я написал этот код утилиты для этой цели:
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)
2 ответа
Как вы сказали в комментарии, нет ни одного модуля, который я бы нашел, чтобы сделать правило из набора ограничений. Если это возможно для вас, вы можете рассмотреть 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
Естественный способ сделать это - если вы не пишете библиотеку iCalendar - это использовать уже существующую библиотеку iCalendar, которая имеет методы для работы с правилами повторения и т. Д., В качестве объектов вместо анализа и генерации строк.
Возможно, такой библиотеки нет, и в этом случае вам не повезло. Но первое, что вы должны сделать, это найти один.
Быстрый поиск в PyPI открывает множество возможностей. Первый, iCalendar, описывается как "парсер / генератор файлов iCalendar", что звучит как хороший кандидат. Просмотри документы или просто pip install
это и играть с ним, чтобы увидеть, если он может делать то, что вы хотите.