1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| from icalendar import Calendar from datetime import date, time, datetime import pytz
uniform_tz = pytz.timezone("Asia/Shanghai") watershed_datetime = datetime(2022, 1, 1, 0, 0, 0, tzinfo=uniform_tz) is_before_watershed_datetime = True
read_file_path = "my-calendar.ics" save_file_path = "my-calendar-20220101.ics"
def get_datetime_from_event(event, param): result = event.get(param).dt if type(result) == date: result = datetime.combine( result, time(tzinfo=uniform_tz), ) return result
with open(read_file_path, "r") as f: cal = Calendar.from_ical(f.read())
new_cal = Calendar()
param_list = ["dtstart", "dtend", "due", "completed", "dtstamp"] watershed_datetime = watershed_datetime.replace(tzinfo=pytz.UTC) for event in cal.walk(): if event.name not in [ "VEVENT", "VTODO", "VJOURNAL", "VFREEBUSY", "VTIMEZONE", "VALARM", ]: continue dates = list() for param in param_list: try: dates.append(get_datetime_from_event(event, param)) except AttributeError: pass
if len(dates) > 0: event_datetime = max(dates).replace(tzinfo=pytz.UTC) if ( event_datetime >= watershed_datetime ) ^ is_before_watershed_datetime: new_cal.add_component(event) else: new_cal.add_component(event)
with open(save_file_path, "w") as f: f.write(new_cal.to_ical().decode("utf-8").replace("\r\n", "\n").strip())
|