# Zafu Timetable Ics

> 把浙江农林大学（东湖校区）学生课表（PDF 或图片）整理成可导入苹果日历/Outlook/Gmail 的 .ics 文件。当用户上传课表 PDF/截图并要求"生成日历/ics/导入苹果日历/课表转日历"时使用。自动按节次映射夏令时作息时间、标注上课地点与教师、节前15分钟提醒、跳过校历节假日、把军训/国家安全教育/期末考试设为全天事件。

- Skill: `yankysqiu/zafu-timetable-ics` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add yankysqiu/zafu-timetable-ics`
- Raw SKILL.md: https://api.skillmd.com/api/skills/yankysqiu/zafu-timetable-ics/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: yankysqiu (https://skillmd.com/u/yankysqiu)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/yankysqiu/zafu-timetable-ics

---


# 课表转 .ics（浙江农林大学）

把学生课表转成一份可直接导入 iOS/Outlook/Gmail 的 .ics。**不要自行编造钟点**：节次时间取自作息表、周次/教室/教师取自课表原文。

## 流程

1. **读课表**
   - PDF：`pdftotext -layout <课表.pdf> -`
   - 图片：用 Read 工具以大缩略图读图。
   - 按 [references/parsing-guide.md](references/parsing-guide.md) 逐格抽取课程名、节次、周次、地点、教师、学分，并按表头确定 weekday（0=周一…6=周日）。
   - 地点统一写作 `浙江农林大学东湖校区 <场地>`；`教X楼`/`学X楼` 是完整楼名，不要拆开。

2. **写 config.json**：复制 `examples/sample_config.json`，只改 `student_name`、`out_path` 和 `courses` 数组。
   - `weekday` 0-6；`start_p`/`end_p` 为节次；`weeks_spec` 照抄课表写法。
   - 不填的校历常量（week1_monday/period_time/holidays/makeup/allday_events）用脚本默认值；新学期/新校历再覆盖，见 [references/academic-calendar.md](references/academic-calendar.md)。

3. **生成**：
   ```bash
   python3 scripts/generate_ics.py <你的config.json>
   ```
   脚本会打印每条课程的上课日期列表，逐条核对周次、单双周、教室、教师与课表一致。

4. **校验**（必做）：
   ```bash
   python3 -c "from icalendar import Calendar; e=Calendar.from_ical(open('<out.ics','rb').read()).walk('VEVENT'); print(len(e), len(set(str(x.get('UID')) for x in e)))"
   ```
   事件数应 = 课程次数 + 调课次数 + 3 个全天事件；UID 无重复。抽查 1~2 个晚间/跨节课程的起止时间是否符合作息表。

5. **交付**：用 present_files 把 .ics 交给用户，说明 iOS 打开后"添加全部日历"即可。

## 硬规则（用户已明确要求）
- 每节课前 **15 分钟**提醒（`alarms_minutes_before: 15`）。
- **军训、国家安全教育（网络）、期末考试** 用全天事件（DATE 类型），**不编造钟点**。
- 节假日（中秋/国庆/元旦）的课跳过；调课日按校历补对应 weekday 的课。
- 时区 `Asia/Shanghai`（UTC+8，无夏令时），DTSTART/DTEND 带 TZID，苹果/Outlook/Gmail 都能正确识别。

