日历
日历导出是怎么工作的,从连接到排查问题。
连接
在 Exporter 主页上点日历旁边的「连接」,然后点「打开日历文件夹」。窗口会在日历自己的文件夹 ~/Library/Group Containers/group.com.apple.calendar 里打开:点「选择此文件夹」。然后选择文件存放位置,点「使用这个文件夹」。
macOS 不会索取日历权限,Exporter 也从不索取:日程是从你授权的那个文件夹里的数据库读出来的,不走 EventKit。你在别的 app 见过的权限对话框,属于另一条路。
文件去哪里
每月一个 Markdown 文件,放在一个文件夹里:2026-09.md、2026-10.md。直接位于个人文件夹下的目录,比如 ~/Documents,里面会建一个 calendar-export 文件夹;更深的目录,比如 ~/Documents/calendar,会原样使用。没有日程的月份不会生成文件。
导出哪些内容
卡片上勾选的日历里的每个日程,都在设定的时间范围内。选择器按账户把日历归类,和日历的边栏一样,所以取消一个勾就能排除一个账户。
一个日程归入它开始的那个月,只归一次,即使它延续到月底之后也一样。
重复
重复的日程出现在每个发生的日子里,而不只是创建它的那天。Exporter 读的是日历为自己的视图保存的发生记录,所以文件和 app 一致,行里也会写明它如何重复。
格式
始终是 Markdown:月份的前置信息,然后每天一个标题、每个日程一行。
一天从全天日程开始,然后按开始时间排列,这正是日历画它的顺序。全天日程写「all day」,绝不会凭空多出一个 00:00。
文件内容
| 键 | 含义 |
|---|---|
title、month |
「日历,2026 年 9 月」和 2026-09 |
events |
这个文件里有多少日程 |
calendars |
当月的日历,最多的排在前面 |
一行是时间、日程、来自哪个日历、在哪里,之后是 vault 可以查询的字段:
| 字段 | 含义 |
|---|---|
repeats:: |
daily、weekly、every 2 weeks |
join:: |
日程带有视频通话链接时的链接 |
with:: |
有多少人参与 |
## 2026-09-17, 星期四
- all day 玛丽莲生日 · 生日
- 09:30-10:00 站会 · 工作 · Zoom [repeats:: weekly] [with:: 6]
- 13:00-14:00 和 Kevin 吃午饭 · 个人 · Philz Coffee
往回读多久
卡片上的「reads」一行:今年、2 年、5 年或全部。它决定写出哪些文件,范围越窄导出越小。
日历为自己的视图保存大约两年的发生记录,能读的也就这些:在真实的 Mac 上,2 年、5 年和全部返回的是同一批日程。「全部」指这台 Mac 上有的全部,而不是曾经发生过的全部。
免费与解锁
前 100 个事件免费,而且一直免费。解锁日历会导出其余部分(价格)。
同步与完全重新同步
第一次「sync now」之后,只要某个月里有变化,Exporter 就会重写那个月,最快每分钟一次。移动一个日程只会重写它所在的那个月。
「full resync」会先询问,然后删除 Exporter 写过的月份文件,并把每个勾选的日历重新写一遍。文件夹里的其他东西都会保留。
问题与办法
- 「no calendar database in that folder (pick the Calendar folder itself)」:再次点「connect」,选择窗口打开时所在的那个文件夹
- 少了一个日历:它在卡片上被取消了勾选,或者整个账户被取消了。选择器按账户归类
- 少了旧日程:「reads」那一行设成了更短的范围,或者日历自己也不再保存它们
- 提醒事项混进了导出:日历会把安排了时间的提醒事项显示为一个单独的日历。在卡片上取消「Reminders」账户的勾选