Open Taiwan Calendar — Obsidian 的台灣農民曆插件:國定假日、補班補假、農曆與二十四節氣

Obsidian 的台灣農民曆插件:國定假日、補班補假、農曆與二十四節氣,可切換月/年檢視,提供側邊欄與可拖曳的懸浮視窗,並能搭配 QuickAdd 建立日記、週記、月記、季記與年記。

[![版本](https://img.shields.io/github/v/release/aione314159/open-taiwan-calendar?label=%E7%89%88%E6%9C%AC)](../../releases/latest) [![下載次數](https://img.shields.io/github/downloads/aione314159/open-taiwan-calendar/total?label=%E4%B8%8B%E8%BC%89%E6%AC%A1%E6%95%B8)](../../releases) [![Obsidian 1.13.0+](https://img.shields.io/badge/Obsidian-1.13.0%2B-7C3AED)](#前置需求) [![僅支援桌面版](https://img.shields.io/badge/%E5%B9%B3%E5%8F%B0-%E5%83%85%E6%94%AF%E6%8F%B4%E6%A1%8C%E9%9D%A2%E7%89%88-555555)](#前置需求) [![無網路存取](https://img.shields.io/badge/%E7%B6%B2%E8%B7%AF%E5%AD%98%E5%8F%96-%E7%84%A1-0a7ea4)](#功能) [![MIT 授權](https://img.shields.io/badge/%E6%8E%88%E6%AC%8A-MIT-9e9e9e)](./LICENSE) [📥 下載](../../releases/latest) · [💡 功能](#功能) · [🗓️ 放假日期怎麼決定](#台灣放假日期是怎麼決定的) · [🛠️ 安裝](#安裝) · [🐞 回報問題](../../issues/new)

English · 繁體中文

側邊欄的日曆,與當天的日記並排

懸浮視窗的月檢視,顯示國慶日、光復節與補假補班 年檢視,十二個月與對應的農曆月份

--- ## 功能 - 月檢視的每一格顯示農曆日期、節氣與台灣節日;年檢視一次列出十二個月。 - 國定假日、補假與補行上班依行政院人事行政總處公告的辦公日曆表判定。 - 側邊欄檢視與懸浮視窗,懸浮視窗可任意拖曳與縮放,兩者都會自動縮放以貼合容器。 - 點任一格開啟該日/週/月/季/年的定期筆記,已存在的筆記會在格子下緣顯示圓點。 - 自己的活動與提醒:**存在每日筆記本身**,在日期下緣顯示彩色圓點,與「有筆記」的圓點並排成一列,依序排開不重疊。提醒與活動可各自設定顏色。 - 提醒依你訂的規則觸發(例如前一天一次、當天再一次),可走彈出視窗、角落提示、系統桌面通知,三者任選或全開。 - 當天的活動會寫進每日筆記最上方,用註解標記包住的區塊,改寫時完全不動標記外的內容。 - 閱讀模式在筆記最上方畫出這篇自己的項目,所以 frontmatter 讀起來是一列一列的項目,而不是原始 YAML 表格——或者什麼都沒有,那是 Obsidian 的「文件中的屬性」設成隱藏時的樣子。 - 有項目的日期在日曆上用同一個橘色框起來,被標記的日期點開,看到的是同一個橘色的區塊。 - 快速新增視窗看得懂整句話(「提醒我週六要把 macbook pro 16 寸帶回家」),並把讀到的日期列出來讓你先確認再存。 - 可選的 QuickAdd 整合,並提供農曆、節氣、節日名稱的範本變數。 - 介面隨 Obsidian 顯示語言在繁體中文與英文之間切換。 - 完全不連網。假日資料隨插件打包,CI 會掃描產出的 `main.js`,只要出現任何網路呼叫點就讓發布失敗。 ## 前置需求 定期筆記由核心的 **每日筆記(Daily Notes)** 或社群插件 **Periodic Notes** 提供,至少要啟用其中一個。週記也認得 **Calendar** 插件的設定。沒有任何提供者啟用的粒度仍會顯示在日曆上,但不可點擊,滑鼠移上去會說明原因。 ## 安裝 在 **設定 → 第三方插件 → 瀏覽** 搜尋「Open Taiwan Calendar」。 手動安裝則從 [最新發行版](https://github.com/aione314159/open-taiwan-calendar/releases/latest) 下載 `main.js`、`manifest.json`、`styles.css`,放進 `<你的庫>/.obsidian/plugins/open-taiwan-calendar/`,再重新載入 Obsidian。 ## 介面說明 ### 工具列(最上方一列) | 元件 | 說明 | |------|------| | 齒輪圖示 | 直接開啟本插件的設定頁 | | 今 | 跳回今天所在的月份,同時開啟今日日記(不存在就建立);不改變目前是月檢視或年檢視 | | 月 | 切換到月檢視(六週 × 七天的網格) | | 年 | 切換到年檢視(十二個月格) | ### 導覽列(第二列) | 元件 | 說明 | |------|------| | « | 上一年 | | ‹ | 上一個月 | | 年/月/季 標題 | 三段各自可點,分別開啟該年、該月、該季的定期筆記 | | 標題下方的灰字 | 該日的干支年與農曆月,例如「丙午馬年七月」 | | › | 下一個月 | | » | 下一年 | ### 左側欄位 - **月檢視**:顯示「週」欄與該列的週數,點下去開啟該週的週記。 - **年檢視**:顯示四個季度,點下去開啟該季的季記。 ### 日期格 每一格由三個部分組成: 1. **日期數字** 2. **第二行文字**:依序取「節日名稱 → 節氣 → 農曆日」,只顯示最優先的一項。名稱超過三個字會截斷並加上省略號,滑鼠移上去顯示全名。 3. **右上角標**:`今`(今天)、`休`(放假)、`班`(補行上班)。 格子的框線與顏色代表狀態: | 外觀 | 意義 | |------|------| | 藍色框線、藍字 | 今天 | | 紅色框線、紅字 | 國定假日或補假 | | 深色框線 | 補行上班(雖然是週末仍要上班) | | 紅字無框線 | 一般週末 | | 淡化 | 不屬於當月,或是已經過去的日期(可在設定關閉) | | 橘色框線、淡橘底 | 該日有活動或提醒 | | 下緣圓點 | 該日已經有筆記 | ### 操作 | 操作 | 結果 | |------|------| | 點擊 | 開啟該格對應的定期筆記,不存在時先詢問再建立 | | Ctrl/Cmd + 點擊 | 在新的分割窗格開啟 | | 右鍵 | 開啟筆記選單,最上面一項是「在這天新增活動」 | | 徽章 | 今/休/班以圓形徽章顯示在右上角,同一天有多個時並排不重疊 | | 滑鼠移上 | 顯示筆記預覽,需先在「頁面預覽」核心插件把 Open Taiwan Calendar 打開 | ## 台灣放假日期是怎麼決定的 這是本插件與其他農民曆插件最大的差別:**假日判定完全依據中華民國的辦公日曆表**,而不是其他地區的節假日規則。判定分成三層,由上往下覆蓋。 ### 第一層:演算法計算(任何年份都正確) 以下假日不需要任何資料表,插件會直接算出來,所以查 2030 年或 1998 年都不會缺漏: - **固定日期的國定假日**:開國紀念日(1/1)、和平紀念日(2/28)、兒童節(4/4)、勞動節(5/1)、國慶日(10/10) - **三大農曆節日**:春節、端午節、中秋節 - **清明節**:依二十四節氣的清明推算,不是固定 4/5 ### 第二層:2025 年修法恢復放假的三個紀念日 《紀念日及節日實施條例》於 2025 年將以下三個紀念日恢復為放假日,插件同樣以演算法處理,並且**只從 2025 年起生效**——2024 年以前不會被回溯標成假日: - 孔子誕辰紀念日(9/28) - 台灣光復暨古寧頭大捷紀念日(10/25) - 行憲紀念日(12/25) ### 第三層:官方公告的補班補假(內建 2024–2026) 補假與補行上班沒有規則可循,每年由行政院人事行政總處另行公告。插件內建了**已公告年份**的完整資料(目前為 2024、2025、2026 年),資料來源為 [ruyut/TaiwanCalendar](https://github.com/ruyut/TaiwanCalendar)(整理自 data.gov.tw 開放資料)。 尚未公告的年份會自動退回第一、二層的演算法結果,也就是**國定假日正確,但沒有補假與補班調移**。 ### 自己補上新年度的假日資料 等人事行政總處公告新年度日曆表之後,不必等插件更新,自己貼上就會生效: 1. 開啟 **設定 → Open Taiwan Calendar** 2. 找到 **節慶資料** 區塊的 **補假調移資料覆蓋(JSON)** 3. 貼上該年度的 JSON 4. **點一下編輯框以外的地方**(失焦即儲存並套用)

設定頁的節慶資料區塊與補假調移資料覆蓋 JSON 編輯器

編輯器旁的 **格式化** 會把 JSON 重新排版,**帶入明日範例** 會填入一筆以明天為日期的範例,改成你要的內容即可。 JSON 的結構是「年份對應到當年所有特殊日期的陣列」: ```json { "2027": [ { "date": "01-01", "name": "開國紀念日", "isHoliday": true, "isMakeupWorkday": false }, { "date": "02-06", "name": "農曆除夕", "isHoliday": true, "isMakeupWorkday": false }, { "date": "02-20", "name": "補行上班", "isHoliday": false, "isMakeupWorkday": true }, { "date": "04-05", "name": "補假", "isHoliday": true, "isMakeupWorkday": false } ] } ``` | 欄位 | 型別 | 說明 | |------|------|------| | `date` | 字串 | 月日,格式固定為 `MM-DD`,要補零 | | `name` | 字串 | 顯示在格子第二行的名稱,例如「補假」「補行上班」 | | `isHoliday` | 布林 | `true` 代表放假,格子顯示紅色與「休」角標 | | `isMakeupWorkday` | 布林 | `true` 代表補行上班,格子顯示深色框線與「班」角標 | 幾個要注意的地方: - 覆寫是**整年替換**,不是逐筆合併。填了 `"2027"` 就代表這一年的特殊日期全部以你填的為準,內建資料在該年度不再套用。 - 想清掉填錯的資料,把整個內容換成 `{}` 再失焦即可。 - 格式錯誤或欄位缺漏的項目會被忽略,並在右上角以通知告訴你略過了幾筆,不會讓整個日曆掛掉。 - 節日名稱維持繁體中文原文(例如「補假」「補行上班」),因為它是政府日曆表的專有名詞,也是這份資料的比對依據,換成英文會對不上。 ## 設定頁其他選項 | 設定 | 說明 | |------|------| | 版面 | 一般/精簡兩種尺寸,精簡版面適合較窄的側邊欄 | | 圓點大小 | 小/中/大三段,同時套用到「有筆記」與活動的圓點 | | 滑鼠停留顯示預覽 | 關掉本插件的筆記預覽彈窗,不影響其他插件 | | 過去日期淡化 | 把今天以前的日期調淡,仍然可以點擊開啟 | | 懸浮視窗 | 開關、寬度;寬度改動會即時套用到已開啟的懸浮視窗 | | QuickAdd | 各粒度可各自指定要走的 QuickAdd choice | | 一鍵設定日記 | 檢查每日筆記的資料夾、格式與範本是否備齊,列出待辦後一次完成設定 | | 在閱讀模式顯示項目 | 閱讀模式的筆記最上方要不要畫出這篇的提醒與活動 | | 活動與提醒 | 提醒與活動各自的預設圓點顏色、提醒總開關與預設規則、三個通知管道、稍後提醒間隔 | | 你的活動 | 已建立的活動清單,點進去可改標題、日期、顏色與提醒規則,也可刪除 | ## 活動與提醒 ### 資料放哪 **每日筆記就是資料庫。** 沒有側邊資料檔。新增一筆會寫進它涵蓋的每一天的每日筆記 `otc-events` 屬性裡,筆記不存在就建立——所以九天的行程,九天的日誌都看得到。 ```yaml --- date: 2026-08-29 星期六 tags: ['diary'] otc-events: - id: da25b36f-cde1-427b-94b7-16d49a20a2b8 title: 把 macbook pro 16 寸帶回家 start: 2026-08-29 end: 2026-08-29 color: "#e07a5f" remindDaysBefore: [1, 0] remindTime: "09:00" --- ``` 這樣做的好處:資料跟著筆記一起同步、進版控、被合併,可以直接在 Obsidian 的屬性面板 手改,而且**移除插件之後資料還在**。代價是區間活動在磁碟上有 N 份, 所以改日期或刪除要動 N 個檔;區間上限 62 天,年份打錯不會生出上百個檔案。 ### 四種新增方式 | 方式 | 說明 | |------|------| | 工具列左上角的行事曆圖示 | 打一句話,日期與天數自動讀出來 | | 命令面板「新增活動/提醒」 | 同上 | | 日期格右鍵 →「在這天新增活動」 | 預設日期是你點的那一天 | | 筆記裡選一行 → 右鍵 →「新增提醒」/「新增活動」 | 選到的文字直接當句子解析 | 日期預設值:有開著每日筆記時用那一天,沒有就用今天;從日期格右鍵進來則用你點的那一天。 「開始」「結束」右邊各有一顆行事曆按鈕。**改開始日時結束日會跟著移動**(長度不變), 且結束日不能早於開始日。 快速新增視窗看得懂的句型: | 句子 | 讀成 | |------|------| | 提醒我週六要把 macbook pro 16 寸帶回家 | 下一個週六,單日,開提醒 | | 10月24,我要去日本旅遊9天 | 10/24 到 11/01 | | 3天後 牙醫回診 | 今天 +3 天 | | 下下週一 季報 | 下下週的星期一 | | 十月五日 出差三天 | 10/05 到 10/07 | 沒帶年份的日期取「今天之後最近一次」的那一年。讀錯了直接在下面的欄位改掉即可。 ### 看全部項目 工具列的清單圖示(或命令面板「顯示提醒與活動」)會開一個視窗,分「提醒」與「活動」兩個分頁。 進行中的排最上面並標示「進行中」,未來的接在後面,**已過期的沉到最下面並變灰**。 每一列可直接編輯或刪除。 ### 提醒規則 「提前幾天」是一串數字:`1, 0` 是前一天一次、當天再一次;只填 `0` 就是當天才提醒。 Obsidian 開啟時若當天的觸發時間已過,會在開啟當下補提醒,不會直接跳過。 通知管道(彈出視窗/角落提示/系統通知)是整個保管庫共用的單一設定,不是每筆各自設定。 ### 閱讀模式的項目區塊 閱讀模式會把這篇筆記自己的項目畫在最上方,一列一個:顏色、標題、日期、 提醒規則的白話說明。今天正在進行中的會多一個「進行中」標記。 **唯讀。** 要改就改 frontmatter,或用快速新增視窗——區間活動在多篇筆記各有一份, 多開一個編輯入口只會讓那幾份對不起來。 不看 Obsidian 的「文件中的屬性」設定:那個設定只能在原始 YAML 表格與什麼都不顯示 之間二選一,兩個都答不出「今天有什麼」。要關掉這個區塊請到 **設定 → 外觀設定 → 在閱讀模式顯示項目**。 ### 每日筆記區塊 區塊用 `%% otc-events:start %%` 與 `%% otc-events:end %%` 兩個 Obsidian 註解標記界定, 兩種檢視模式下都看不到標記本身。裡面是純 Markdown,不含任何 HTML。 改寫只動兩個標記之間的文字,已經打勾的項目會保留打勾狀態, 當天沒有活動則整個區塊移除,不留空殼,也不會動到你自己留的空行。 ### 關掉滑鼠停留預覽 「設定 → 外觀設定 → 滑鼠停留顯示預覽」可以關掉停在日期上時彈出的筆記預覽。 這個開關只管本插件;去關核心的「頁面預覽」插件會連帶關掉其他插件的預覽。 ## 範本變數 透過本插件建立**日記**時,範本裡的下列變數會被替換成當天的實際值。這些是農曆相關資料,只有日記會填入: | 變數 | 內容 | |------|------| | `{{chineseYear}}` | 農曆年,例如「丙午年」 | | `{{chineseMonth}}` | 農曆月 | | `{{chineseDay}}` | 農曆日 | | `{{ganzhi}}` | 干支 | | `{{solarTerm}}` | 節氣,當天不是節氣時為空字串 | | `{{festivals}}` | 節日名稱,沒有時為空字串 | | `{{lunar}}` | 完整農曆字串 | | `{{dateStr}}` | 檔名加節日名稱 | 沒有對應值的變數會被換成空字串,不會把 `{{solarTerm}}` 這種原文留在筆記裡。 走 QuickAdd 建立筆記時,除了上面這些,週記、月記、季記、年記還會多收到 `start`、`end`、`prevStart`、`prevEnd` 四個參數(該期間的起訖日期),由你的 QuickAdd choice 自行取用。這四個不走上面的範本替換。 ## 開發 ```bash npm install npm run dev # 監看模式 npm run build # 型別檢查 + lint + 產生 main.js ``` ## 授權與致謝 MIT,見 [LICENSE](./LICENSE)。 Open Taiwan Calendar 是獨立實作,擁有自己的假日引擎、繪製邏輯與狀態管理,除了 React 之外不依賴任何 UI 框架。 農曆與節氣由 [lunar-typescript](https://github.com/6tail/lunar-typescript) 計算;定期筆記的讀取與建立透過 [obsidian-daily-notes-interface](https://github.com/liamcain/obsidian-daily-notes-interface);假日資料整理自 [ruyut/TaiwanCalendar](https://github.com/ruyut/TaiwanCalendar)。