介绍
iCalendar 是 RFC 5545 定义的通用日历数据交换标准(下称「ICS 协议」),可以通过 WebDAV / SyncML / HTTP 等方式进行传输。说人话就是,可以直接在日历 app 中导入 .ics
文件或订阅在线源来增加(或删除)日历。
当然,很多日历 app 在联网后都能获取一些常见的节气和节假日数据,如果局限于此,可能会觉得 ICS 协议也没什么稀奇的,但这只是实际应用层的冰山一角,深入挖掘后可以了解到各种奇怪的用法。加之 ICS 格式本身很简单,手搓一个应用也是分分钟的事。
订阅源
- 节假日、调休、补班日历
- 整理自中国政府网,自动维护,支持定制化
- 节假日很多日历都有,但调休和补班就不一定了,在万恶的调休制度取消之前这个功能很实用
- 二十四节气
- 2015 年到 2050 年的节气,由于清明放假,通常会作为节假日包含在其他订阅中,所以实际上订阅源只有二十三节气
- 项目基于 lunar-calendar,后者的数据源来自香港天文台,覆盖 1901 年到 2100 年间两百年的农历 - 公历对照表,自带 3 年数据,也支持生成 200 年间任意时间段的数据,注意由于算法原因 2057 年会出现错位
- Steam 愿望单
- 根据游戏发售日生成日历,用来追新游戏是极好的
- 在 repo secret 设置
STEAMUID
即可由 GitHub Action 自动维护 Steam_ID
可以在 SteamDB 的 Steam Calculator 界面查看- BTW,如果感兴趣也可以看 我的愿望单数据
- VNDB 新游戏发售表
- 我参考上面的 SteamWishlistCalendar 制作的 VNDB-Calendar
- 原理相同,只不过使用的是 VNDB API,同样由 GitHub Action 自动维护
- CnGal 游戏发售日历
- 同上,数据源从 VNDB 替换为 CnGal,由于 CnGal 包含的数据量偏少,其实意义不大
- Firefox Release Calendar
- 火狐浏览器更新日历,同理,其实很多程序更新也能转换成日历,但是这类更新太多,一般建议用 RSS 批量检查更新,或者直接包管理器一条龙
- 课表
- 支持自定义课程周数和其他信息,支持定义教室 GPS 等信息
- 初始配置比较麻烦,可能需要写个 Python 爬虫手动清洗一下教务处数据,然后再录入,但时间表和教室信息之类的后续可以复用
这么想心理就平衡了 - 虽然现在用不到,但说不定哪天就财富自由 + 想不开去多读几个本硕博了
实际应用远远不止这些,常规点像 🐶 都不用的 Facebook、SpaceX 火箭发射也有订阅源,电视剧、演唱会之类的更不用说,还有很多奇怪的例子,比如 Sky Sports 提供的体育赛事日历,LPL & LCK 赛程,Epic 每周免费游戏等等……
当然,对时间不敏感的内容也可以考虑用 RSSHub 生成 RSS,然后通过一系列过滤规则来排除不必要的信息,RSS 展开可以讲很久,有缘再写一篇介绍。
另有随手搓的 rss2ics,可以将 RSS 转换成 ICS。
App
因人而异,这里只简单提几句我的选择。
在桌面端我更喜欢 TUI ,所以用的是 calcurse,理论上可以通过 calcurse-caldav 和 Android 互通日历,但没有实际尝试,手机点一下就能看到日历,很少在桌面端用日历。而且我的工作流比较复杂,看板驱动的 OKR、日/周/月/年记和 todo list 各司其职,他人很难借鉴。
手机上的日历算是两极分化最严重的 app,下限极低,上限极高:
- 不用的人从来不需要,需要的人天天都会打开
- 可以是简单的节假日日历,也可以搞得相当复杂,从早到晚精确到分钟
- 可以只包括单纯的信息,也可以和工作、社交、影音、娱乐 app 联动
Android 通过 ICSx⁵(只支持单向同步,需要双向同步可以选择支持 WebDAV 的 DAVx⁵)订阅 ICS,然后同步到日历,这样可以将订阅获取与日历查看分离,摆脱日历 app 的捆绑,还可以避免 app 联网导致日历泄漏,哪天嫌 Simple Calendar Pro 太丑想换就换,直接导出 ICS + 卸载一条龙已被收购,现在在用社区 fork 的 Fossify Calendar,至于那些连日历导出功能都不肯做,却强制要求联网和访问联系人的垃圾 OEM 日历,不用也罢。
延伸
上个月修复 Hugo /posts 未按照 lastmod 倒序的问题时,顺带加了按照发布时间倒序的 /archive,现在可以在两种排序之间任意切换,后者当然也支持 订阅。
跑题了,我想说的是在此期间发现 Hugo 支持 输出自定义格式,其中就包括 ICS,这输出看起来类似 RSS,应该几分钟就能搞定,然而折腾俩小时也没鼓捣出来,估计和 Gopher/Gemini 支持一样是 #有生之年 系列已完成,记录在 Add ICS Output to Hugo Blog:
- Create one ICS file that contains all events(文件结构)
- Custom output formats(Hugo 文档)
- Calendar (ics) template
- layouts/talks/list.ics
- support non-Gregorian calendars #5526(ICS 协议本身就不支持,RFC 4324 尝试解决未果)