如何制作在线的日历ics文件,最后介绍各个设备如何使用
是什么
ICS为iCalendar的文件名,它是“日历数据交换”的标准。大多数日历本质创建事项都是通过ics这种格式来生成、解析。详见Wikipedia
为什么
一般来说,对于临时会议/事件,就直接在日历添加事件即可。但如果是一些周期性、某个时间段持续的事件活动,如果手动添加就很麻烦,比如最常见的就是课表。还有一些如学术会议、球赛、定期活动、节假日等。这类往往是通过他人制作好ics文件,本地导入即可。
怎么做
我的目标就是制作自己的课表(在线)
格式
1 | BEGIN:VCALENDAR |
以行为分隔,每行以冒号分隔。
第一行,每个ics文件的开头,对应最后一行
第二行,版本(默认)
第三行:可自定义,文件说明
第四行:定义一个事件名称,对应倒数第二行
第五行:唯一的id
第六行:创建这个事件的时间
第七行:可忽略
第八行:开始时间
第九行:结束时间
第十行:事件名称
我的示例
1 | BEGIN:VCALENDAR |
相比于原始格式,多添加了一个事件,并且添加了地点
LOCATION
和事件描述 DESCRIPTION
生成
既然知道格式,那么生成就很简单了,可以自己按照这种格式手写进一个文档,后缀名为ics即可。这里我借助了Python的icalendar来完成这个工作。
以下是一个函数,借助这个函数可以生成一个事件,生成后可以添加至日历中。这里uid因为是要求唯一的,所以借助了uuid来完成。这里有一个小坑,由于我们要是北京时间,所以添加时间是,需要加入
tz_utc_8
这个变量
tz_utc_8 = timezone(timedelta(hours=8))
1 | def cread_event(lesson_name, classroom, teacher, start, end): |
下一个问题就变为,开始时间与结束时间该怎么写。这里需要使用datetime函数,利用datetime来生成时间格式。
1 | for lesson in cls_lst: |
这里需要提前约定好格式。学期开始的年月日、上课的时间及课程上课的周数、时间等。ics是支持固定周期添加事件的,但是由于我的课很乱(上课周数不确定、有的课是1-3节,有的课是2-3节,有的课是1-2节),所以我这里没有使用周期这个功能。
1 | time_dict = { |
完整代码见https://github.com/wnma3mz/Tools/blob/master/others/myics.py
部署
生成ics文件后,如果不需要更新的话,那么可以直接导入到本地的日历中。IOS系统可直接导入,安卓手机部分不支持,且如果导入后删除可能需要手动一个一个删除。。。
注:小米、VIVO经测试不可导入,因为厂商阉割了此功能;魅族、荣耀、三星、苹果、华为均可导入,其中苹果导入的方式是用邮件发送到ios设备上的已绑定的邮件中。
故基于此,最终考虑还是使用在线部署的方式进行导入。为方便IOS导入,所以需要配置好https。
1 | server { |
部署成功后,直接访问ics.test.com会直接该ics文件
各个设备配置
Windows端(浏览器):Outlook、谷歌日历均有在线导入ics文件的入口
IOS/MacOS端:添加账号中,导入ics文件的域名即可
安卓端:由于原生日历不支持该项功能,故使用OneCalendar。当然,也可以在Windows端配置好后,下载对应APP亦可。
写到最后
制作完成之后发现,我校居然自动生成了ics文件。。。(但感觉还是不如自己做的好。。。。)