std::chrono无法判断中国法定工作日,必须依赖外部节假日配置数据;需用std::chrono::sys_days归一化日期后查表,优先匹配workdays,再holidays,最后按周一至周五默认判断。

法定工作日判断不能只靠 std::chrono
标准 C++ 库(包括 std::chrono、std::tm)本身不包含任何中国法定节假日或调休信息。它只能告诉你某天是星期几、是否闰年、是否在某范围内,但无法回答“2025 年 2 月 4 日是不是工作日”——那天是除夕,按国务院通知是调休上班日,但 std::chrono 算出来只是个普通周二。
必须引入外部节假日规则数据
国内通用做法是依赖一份可维护的节假日配置(JSON/CSV/内置数组),内容至少包含:
-
workdays:明确标记为“实际工作日”的日期(如调休上班的周末) -
holidays:明确标记为“放假”的日期(含调休形成的连续假期) - 优先级规则:若某日同时出现在
workdays和holidays中,以workdays为准(国务院通知中“调休上班”优先级高于“周末休息”)
示例片段(JSON):
{
"holidays": ["2025-01-28", "2025-01-29", "2025-01-30", "2025-01-31"],
"workdays": ["2025-02-01", "2025-02-02"]
}
用 std::chrono::sys_days 做日期归一化再查表
把输入日期转成 std::chrono::sys_days(即自纪元起的天数),再转成 YYYY-MM-DD 字符串格式,用于匹配配置中的日期字符串。避免手动解析年月日带来的时区/闰秒陷阱。
关键步骤:
- 用
std::chrono::year_month_day构造输入日期,再隐式转为std::chrono::sys_days - 用
.time_since_epoch().count()或直接用std::format(C++20)生成标准格式字符串 - 查表时先查
workdays,再查holidays,最后 fallback 到 weekday 判断(周一至周五为默认工作日)
简短示意:
bool is_workday(std::chrono::year_month_day ymd) {
auto sd = std::chrono::sys_days{ymd};
std::string date_str = std::format("{:%Y-%m-%d}", sd);
if (workdays_set.count(date_str)) return true;
if (holidays_set.count(date_str)) return false;
return (static_cast<int>(ymd.weekday()) >= 1 &&
static_cast<int>(ymd.weekday())
<h3>每年更新配置比写算法更重要</h3>
<p>国务院一般在每年 11 月发布下一年的放假安排,其中包含具体调休日期。硬编码逻辑(比如“春节总在农历正月初一前后七天”)会出错——2024 年春节假期从 2 月 10 日(初一)放到 2 月 17 日,但 2 月 16 日(周六)被明确指定为上班日,而 2 月 17 日(周日)却是假期最后一天。</p>
<p>所以实际工程中:</p>
<ul>
<li>不要试图用农历推算节日,直接用官方发布的公历日期列表</li>
<li>把节假日配置做成可热加载的文件(如 JSON),避免每次发版都要改代码</li>
<li>务必注意跨年场景:2025 年元旦调休可能涉及 2024 年 12 月 28、29 日上班</li>
</ul>
<p>最常被忽略的点:调休日和真实周末重叠时(例如某周六本就是工作日,又恰好是法定假日),需以国务院通知原文为准,不能仅靠集合运算。</p></int></int>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











