计算两个日期之间的工作日天数

在美国,2026年12月1日至31日包含起止日期,共有22个工作日:周一至周五共23天,减去12月25日星期五的圣诞节。先计算日期范围内周一至周五的天数,再扣除落在这些日期上的节假日。

使用 API 计算

Narwhal 没有工作日端点。使用 GET /v1/calendars/holidays/{country}/{year} 读取指定国家和年份的节假日,再统计周一至周五中未出现在该列表中的日期。这里的工作日指所选国家中不属于节假日的周一至周五。计算时,每个国家的每个年份需要一次请求,跨年范围中的每个年份都需要单独请求。

  1. 获取你的 API 密钥 获取免费 API 密钥,并将其保存在 NARWHAL_API_KEY 环境变量中。脚本通过 Authorization: Bearer YOUR_KEY 请求头将密钥发送至 https://api.narwhalapi.com。
  2. 选择国家和日期范围 使用 ISO 3166 alpha-3 国家代码,例如 USA、GBR、JPN、DEU 或 IDN。示例使用 USA,计算2026年12月1日至31日的天数,包含起止日期。
  3. 统计不在假日集合中的周一至周五日期 在此 Python 脚本中使用你选择的日期。脚本将范围内每个年份的假日日期汇总到一个集合中,然后只统计未出现在集合中的周一至周五日期。
    Python,两个日期之间的工作日天数
    import os
    from datetime import date, timedelta
    import requests
    
    API = "https://api.narwhalapi.com"
    HEADERS = {"Authorization": f"Bearer {os.environ['NARWHAL_API_KEY']}"}
    
    def holidays(country: str, year: int) -> set[str]:
        r = requests.get(f"{API}/v1/calendars/holidays/{country}/{year}", headers=HEADERS, timeout=10)
        r.raise_for_status()
        return {h["date"] for h in r.json()["holidays"]}
    
    def business_days(start: date, end: date, country: str = "USA") -> int:
        """Business days from start to end, counting both ends, like NETWORKDAYS."""
        off = set()
        for year in range(start.year, end.year + 1):
            off |= holidays(country, year)
        days = (start + timedelta(n) for n in range((end - start).days + 1))
        return sum(1 for d in days if d.weekday() < 5 and d.isoformat() not in off)
    
    print(business_days(date(2026, 12, 1), date(2026, 12, 31)))
  4. 查看所选范围的结果 对于美国2026年12月1日至31日,脚本输出 22。未来年份的日历发布后即可使用;未发布的日历返回 404 calendar_not_published。

美国联邦政府2026年日历包含11个假日日期:1月1日、1月19日、2月16日、5月25日、6月19日、7月3日、9月7日、10月12日、11月11日、11月26日和12月25日。对于仅限2026年12月的日期范围,这份年度列表中落在该范围内的日期是圣诞节。

使用电子表格或手动计算

在 Excel 或 Google Sheets 中,将假日日期放入一列,并将该列用作 Holidays 范围。从 Narwhal 假日日历 (英语)中的国家页面复制日期,或从 API 响应中获取日期。公式统计日期范围内周一至周五的天数,并排除假日列中的日期。范围包含起止日期。

Excel 或 Google Sheets
=NETWORKDAYS(DATE(2026,12,1), DATE(2026,12,31), Holidays)

对于美国2026年12月,使用仅含 2026-12-25 的单单元格 Holidays 范围,结果为 22。不提供假日范围时,公式的结果为 23,因为它只统计周一至周五的天数,没有扣除圣诞节。假日列应与所计算的国家和年份对应。跨年范围需要包含每个年份的假日日期。

无需脚本或电子表格公式计算时,可在国家日历页面查找节假日日期。统计所选范围内周一至周五的天数,再扣除列表中落在这些日期上的假日。

不同情况应选哪种方法

情况最合适的方法原因
少量日期的一次性计算电子表格中的 NETWORKDAYS,配合假日列公式包含起止日期,并扣除提供的假日日期
大量日期对或每晚运行的任务Python 脚本,每个国家的每个年份只获取一次假日数据同一国家和年份的日期对可复用假日集合
地区工作日或银行营业日使用 scope 和 subdivision_codes,或自己的假日列表假日列表必须与所需日历一致

计算是否包含起止日期?

是的。Python 脚本和 NETWORKDAYS 都包含起止日期。每个边界日期仍须符合工作日条件:星期六、星期日或节假日均不计入总数。包含起止日期界定了计算范围;周几和假日规则决定哪些日期计入结果。

如需计算夜数或排除结束日期,若结束日期是工作日,则减去1。如果结束日期已因周末或节假日被排除,则工作日总数保持不变。

假日遇上周末时有何变化?

如果该国家安排补假,请使用补假日期。API 使用 observed: true 标记补假日期。美国2026年日历将独立日列在7月3日星期五,因为7月4日是星期六。

计算2026年7月1日至31日时,从周一至周五的天数中扣除7月3日星期五。7月4日星期六已不在周一至周五的统计范围内,因此无需再次扣除。补假应使用日历提供的日期。

周末或地区假日不同时怎么办?

使用与你的日历一致的周末安排和假日适用范围。Python 脚本将星期六和星期日视为周末。如果周末是星期五和星期六,在电子表格中使用 NETWORKDAYS.INTL(start, end, 7, Holidays)。

假日条目包含 date、name、scope 和 subdivision_codes,有时也包含 local_name。地区日历应使用适用范围和行政区划字段筛选,再按日期去重。2026年,GBR 分别列出英格兰和威尔士、北爱尔兰及苏格兰的条目:共28行,包含14个不同日期。

银行、交易所和公司日历可能与节假日日历不同。美国列表的适用范围为 federal_government;NYSE 在2026年4月3日耶稣受难日休市,该日期不在这份联邦假日列表中。如果所需日历不同,请使用自己的列表。

计算示例:美国2026年12月1日至31日

2026年12月有31天,12月1日是星期二。包含月初和月末,周一至周五共23天。圣诞节是2026年12月25日星期五,因此需扣除这个落在周一至周五的假日。

美国日期范围周一至周五的天数落在周一至周五的假日工作日天数
2026年12月1日至31日231,12月25日圣诞节23 - 1 = 22
2026年11月20日至12月4日111,11月26日感恩节11 - 1 = 10

第二个范围包含2026年11月20日和12月4日。范围内周一至周五的日期是11月20日、23日、24日、25日、26日、27日和30日,以及12月1日、2日、3日和4日。周一至周五共11天。感恩节是2026年11月26日星期四,扣除后得到10个工作日。

发布于。