列出多个国家的节假日

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)

公式统计其他国家列中匹配的单元格数。A 列所属国家已由 A2 中的日期表示,因此公式结果表示表格其他位置的匹配数。粘贴时请将每个国家的日期放在一起,以便追溯匹配结果对应的日历。将公式复制到 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 年五国唯一共同的假日日期。

发布于。

后续步骤