在美国,2026年12月1日至31日包含起止日期,共有22个工作日:周一至周五共23天,减去12月25日星期五的圣诞节。先计算日期范围内周一至周五的天数,再扣除落在这些日期上的节假日。
使用 API 计算
Narwhal 没有工作日端点。使用 GET /v1/calendars/holidays/{country}/{year} 读取指定国家和年份的节假日,再统计周一至周五中未出现在该列表中的日期。这里的工作日指所选国家中不属于节假日的周一至周五。计算时,每个国家的每个年份需要一次请求,跨年范围中的每个年份都需要单独请求。
- 获取你的 API 密钥 获取免费 API 密钥,并将其保存在
NARWHAL_API_KEY环境变量中。脚本通过Authorization: Bearer YOUR_KEY请求头将密钥发送至https://api.narwhalapi.com。 - 选择国家和日期范围 使用 ISO 3166 alpha-3 国家代码,例如
USA、GBR、JPN、DEU或IDN。示例使用USA,计算2026年12月1日至31日的天数,包含起止日期。 - 统计不在假日集合中的周一至周五日期 在此 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))) - 查看所选范围的结果 对于美国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 响应中获取日期。公式统计日期范围内周一至周五的天数,并排除假日列中的日期。范围包含起止日期。
=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日 | 23 | 1,12月25日圣诞节 | 23 - 1 = 22 |
| 2026年11月20日至12月4日 | 11 | 1,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个工作日。
发布于。
