如何确定日期时间对象是否与 ical 字符串重叠?

问题描述 投票:0回答:0

假设我有一个字符串:

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)))

python icalendar
© www.soinside.com 2019 - 2024. All rights reserved.