假设我有一个字符串:
cal_str = """
BEGIN:VEVENT
DTSTART;TZID=America/New_York:20211019T000000
DTEND;TZID=America/New_York:20211019T235959
RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TU,WE,TH,FR,SA
X-STATE:convenience
END:VEVENT
"""
还有一个
datetime
对象datetime(2022, 11, 7, 4, 53, tzinfo=timezone.utc)
.
如何确认
datetime
对象落在ical字符串中?我试过使用 rules.between
但这个 datetime
应该与 ical 字符串重叠,但没有。
示例代码:
from dateutil import rrule
import pytz
from dateutil.tz import gettz
from icalendar.cal import Calendar
from datetime import datetime, timedelta, timezone
cal_str = """
BEGIN:VEVENT
DTSTART;TZID=America/New_York:20211019T000000
DTEND;TZID=America/New_York:20211019T235959
RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TU,WE,TH,FR,SA
X-STATE:convenience
END:VEVENT
"""
def test_ical(target_time):
ical = Calendar.from_ical(cal_str)
start_time_dt = ical.get("DTSTART").dt
tzinfo = gettz(str(start_time_dt.tzinfo))
start_time_dt = start_time_dt.replace(tzinfo=None).replace(tzinfo=tzinfo)
end_time_dt = ical["DTEND"].dt if ical.get("DTEND") else None
irrule = ical.get("RRULE")
recurring_rule = irrule.to_ical().decode('utf-8')
rules = rrule.rruleset()
first_rule = rrule.rrulestr(recurring_rule, dtstart=start_time_dt)
rules.rrule(first_rule)
event_delta = end_time_dt - start_time_dt if end_time_dt else timedelta(days=1)
res = rules.between(target_time - event_delta, target_time + timedelta(minutes=1))
return res
print(test_ical(datetime(2022, 11, 7, 4, 53, tzinfo=timezone.utc)))
print(test_ical(datetime(2022, 11, 9, 4, 53, tzinfo=timezone.utc)))