前言
不想升级IOS,苦于找不到新的日历订阅url,小菜鸡百度来百度去发现ics这东西可以自己做一个,惊喜于看到了这篇文章--使用python获取日历信息并制作订阅文件_https: //github.com/lk-itween/calendar-CSDN博客
感谢作者大大。就想自己写一个,但是发现到网上去找日历也挺麻烦,然后就参照写了一个比较简单的,通过读取EXCEL节假日信息来生成ics,目前已亲测成功。
准备工作
制作一个EXCEL,记录节假日、补班和日期,内容设置纯文本格式
日历订阅文件生成
解析excel,拼接ics,生成文件,源码贴图如下。多个sheet根据sheet名生成多种日历。
#!/usr/bin/python
from datetime import datetime
import xlrdnow = datetime.now().strftime('%Y%m%dT%H:%M:%S')
# name 日历名称
def set_ics_header(name):return "BEGIN:VCALENDAR\n" \+ "PRODID:NULL\n" \+ "VERSION:2.0\n" \+ "CALSCALE:GREGORIAN\n" \+ "METHOD:PUBLISH\n" \+ f"X-WR-CALNAME:{name}\n" \+ "X-WR-TIMEZONE:Asia/Shanghai\n" \+ f"X-WR-CALDESC:{name}\n" \+ "BEGIN:VTIMEZONE\n" \+ "TZID:Asia/Shanghai\n" \+ "X-LIC-LOCATION:Asia/Shanghai\n" \+ "BEGIN:STANDARD\n" \+ "TZOFFSETFROM:+0800\n" \+ "TZOFFSETTO:+0800\n" \+ "TZNAME:CST\n" \+ "DTSTART:19700101T000000\n" \+ "END:STANDARD\n" \+ "END:VTIMEZONE\n"def set_jr_ics(jr, date, uid): # jr: 节日,date:日期,uid:编序return "BEGIN:VEVENT\n" \+ f"DTSTART;VALUE=DATE:{date}\n" \+ f"DTEND;VALUE=DATE:{date}\n" \+ f"DTSTAMP:{date}T000001\n" \+ f"UID:{date}T{uid:0>6}_jr\n" \+ f"CREATED:{date}T000001\n" \+ f"DESCRIPTION:{jr}\n" \+ f"LAST-MODIFIED:{now}\n" \+ "SEQUENCE:0\n" \+ "STATUS:CONFIRMED\n" \+ f"SUMMARY:{jr}\n" \+ "TRANSP:TRANSPARENT\n" \+ "END:VEVENT\n"def concat_ics(year, jjr_list,rq_list): # 返回一个完整的ics文件内容header = set_ics_header(year)# 将节日进行编号,生成list转成字符串jr_ics=''.join(list(map(set_jr_ics, jjr_list, rq_list,list(range(len(jjr_list))))))return header + jr_ics + 'END:VCALENDAR'# 保存文件
def save_ics(fname, text):with open(fname, 'w', encoding='utf-8') as f:f.write(text)#获取excel内容和sheet
def get_xlsfile(path):readfile=xlrd.open_workbook(path)num = readfile.nsheetsreturn readfile,numdef parse_jjr(table):name=table.namejjr=list(table.col_values(0))rq=list(map(dataformat,table.col_values(1)))return name,jjr,rqdef dataformat(date):return datetime.strptime(date, '%Y/%m/%d').strftime('%Y%m%d')if __name__ == '__main__':readfile,num = get_xlsfile('F:/ICS/calendar.xls')for i in range(num):name,jjr_list,rq_list=parse_jjr(readfile.sheets()[i])jr_ics = concat_ics(name,jjr_list,rq_list)filename = f'calendar_{name}.ics'save_ics(filename, jr_ics)
订阅日历信息
参照原文大大,把代码和ics文件上传到gitee仓库:
源码:https://gitee.com/szjungle/calendar/blob/main/calendar.py
ics:https://gitee.com/szjungle/calendar/raw/main/calendar_2024year.ics
直接到日历里添加日历订阅总是验证失败,可以换个方式,用safari打开地址,右上角“添加全部”可以添加到日历中,就成功啦!