列出多個國家的國定假日

2026 年美國有 11 個國定假日,英國有 14 個、日本有 18 個、德國有 9 個、印尼有 17 個,五國唯一共同的假日日期是 1 月 1 日。逐一處理國家代碼,對每個國家和年份發出一次請求,再依假日日期彙整國家,以比較各國行事曆。

使用 API

  1. 取得金鑰並設定環境變數 在註冊頁面取得免費金鑰,並存放在名為 NARWHAL_API_KEY 的環境變數中。指令碼會讀取該變數,並以 Authorization: Bearer YOUR_KEY 傳送金鑰,因此請在執行 Python 的環境中設定。
  2. 選擇國家和年份 在 GET /v1/calendars/holidays/{country}/{year} 中使用 ISO 3166 alpha-3 國家代碼:範例會請求 USA、GBR、JPN、DEU 和 IDN 的 2026 年資料。每個國家和年份都需要各自的請求,因此這次比較會發出五次請求;請讓要比較的國家使用相同年份。
  3. 依日期彙整國家 執行 Python 指令碼,請求各國假日並依 date 將回應項目分組,讓每個日期對應一組國家代碼。指令碼會將日期排序,列印至少三個國家共有的日期,再從完整資料中計算每個國家不重複的日期數,包含未出現在共同日期輸出中的日期。
    Python,五國假日
    import os
    from collections import defaultdict
    import requests
    
    HEADERS = {"Authorization": f"Bearer {os.environ['NARWHAL_API_KEY']}"}
    COUNTRIES = ["USA", "GBR", "JPN", "DEU", "IDN"]
    
    by_date = defaultdict(set)
    for country in COUNTRIES:
        r = requests.get(f"https://api.narwhalapi.com/v1/calendars/holidays/{country}/2026",
                         params={"scope": "national_public"} if country == "IDN" else None,
                         headers=HEADERS, timeout=10)
        r.raise_for_status()
        for h in r.json()["holidays"]:
            by_date[h["date"]].add(country)
    
    for day in sorted(by_date):
        if len(by_date[day]) >= 3:
            print(day, sorted(by_date[day]))
    print({c: sum(1 for d in by_date.values() if c in d) for c in COUNTRIES})
  4. 讀取共同日期與各國總數 2026 年的共同日期輸出包含 1 月 1 日、4 月 3 日、5 月 25 日和 12 月 25 日,最後一行列出各國不重複的日期總數。這些總數使用美國的 federal_government 範圍、英國的 bank 範圍,以及日本和德國的 national_public 範圍;印尼的請求則明確選用 national_public。

請分別查看共同日期的國家清單和假日名稱。2026 年 5 月 25 日是德國、英國和美國共同的假日日期;在美國,當天是陣亡將士紀念日。指令碼依日期分組,因此日期相符時,各國不必使用相同的假日名稱。2026 年 4 月 3 日的耶穌受難日出現在德國、英國和印尼的資料中,因此也符合共同日期的門檻。該日期的國家清單包含 DEU、GBR 和 IDN。

使用試算表或不寫程式的方式

開啟各國的假日行事曆頁面 (英文),即可直接比較日期,無須使用指令碼。若要用試算表比較,請將各國日期貼到各自的欄中,並讓每個國家內的相同日期只保留一筆。將要比較的日期放在 A2,其他國家的日期清單則放在 B:E 欄。

計算其他欄中相符的日期數
=COUNTIF(B:E, A2)

公式會計算其他國家欄中相符的儲存格數。A2 的日期已代表 A 欄清單所屬的國家,因此公式結果表示工作表其他欄中的相符數量。貼上資料時,請將每個國家的日期放在一起,以便追查相符日期所屬的行事曆。將公式複製到 A 欄中要比較的日期旁。請對照同一列的日期讀取結果;公式會在其他欄中搜尋相同日期,因此各清單不必使用相同的列位置。

各種情況適合的方式

情況最適合的方式原因
一次比較兩個或三個國家行事曆頁面直接查看各國假日日期
建立團隊行事曆或處理跨辦公室薪資作業每年為每個國家執行一次指令碼依日期彙整國家並計算不重複的日期數
僅包含部分地區依回應中的 subdivision_codes 篩選選取與比較相關的行政區

為什麼英國的資料列會重複?

銀行假日因構成國而異,因此每個日期會在各行政區分組中出現一次。2026 年英國的回應有 28 筆原始資料列,因為英格蘭與威爾斯、北愛爾蘭及蘇格蘭各有各的資料列,合併後的行事曆則有 14 個不重複的日期。若要計算該國不重複的日期總數,請用集合彙整日期。

若要建立地區行事曆,請先用回應中的 subdivision_codes 選取相關項目,再彙整日期。這樣就能分別處理地區選擇和不重複日期計數。

如何排除集體休假日?

請在印尼的請求中傳入 scope=national_public,以排除當地的集體休假日。2026 年使用此條件會得到 17 個不重複的國定假日日期,未篩選的回應則有 25 筆資料列,因為其中也包含 collective_leave 項目。在這次比較中,範圍參數應加在印尼的請求上。

請先套用範圍條件,再將日期加入合併資料。否則,比較共同日期或計算印尼假日數量時,資料會包含集體休假日。

各國計算週末假日的方式相同嗎?

不同,各國清單使用各國訂定的日期。有些國家會將假日移至平日,並標示為 observed。比較時請使用回應中的日期,包含其中的補假日期,不要用同一套規則調整各國所有適逢週末的假日。

實作範例:2026 年 12 月 25 日

先從 2026 年 12 月 25 日開始,在各國選定的假日清單中尋找該日期。德國、英國、印尼和美國各計入一個國家代碼;日本在當天沒有假日。即使某國的回應為該日期列出多筆地區資料,每個相符國家仍只計算一次。

國家代碼2026 年 12 月 25 日是否為假日
德國DEU是
英國GBR是
印度尼西亞IDN是
美國USA是
日本JPN否
總計DEU, GBR, IDN, USA5 國中的 4 國

計算 2026 年 12 月 25 日不重複的國家代碼,就會得到五國中的四國。該日期至少由三個國家共有,因此符合指令碼的輸出條件。相較之下,2026 年 1 月 1 日包含全部五個國家代碼,也是 2026 年唯一五國共同的假日日期。

發布於 。

後續步驟