法定工作日判断需结合节假日表、调休表与星期几三重校验:先查调休表(如补班日),再查假期表(如放假日),最后 fallback 到周一至周五;C++ 标准库不提供节假日数据,须外挂可更新的 JSON 或预加载 unordered_set。

法定工作日判断不能只靠 std::chrono 或星期几
单纯用 std::chrono 算出星期几(比如 weekday 是 Monday–Friday)完全不够——国庆调休后周二可能是补班,春节前周六可能放假。C++ 标准库不包含任何节假日数据或调休规则,必须引入外部信息源。
需要维护一份可更新的节假日/调休表
国内法定节假日和调休安排每年由国务院发布,实际项目中推荐两种轻量方案:
- 用 JSON 文件存每年的
holiday_list(含放假起止)和workday_override(如"2024-10-12"表示该周六上班) - 用 C++
std::unordered_set<:string></:string>预加载已知年份的日期字符串(格式统一为"YYYY-MM-DD"),避免运行时解析开销 - 注意:闰年、跨年调休(如 2025 年元旦可能调休到 2024 年末)需按当年公告手动录入,无法自动推导
核心判断逻辑要分三步走
给定一个 std::chrono::sys_days,先转成 YYYY-MM-DD 字符串,再查表:
- 若在
workday_override中 → 是工作日(哪怕周日) - 若在
holiday_list中 → 不是工作日(哪怕周一) - 否则看 weekday:仅当是周一至周五 且 不在上述两表中 → 才算法定工作日
示例片段(伪代码逻辑):
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
bool is_official_workday(std::chrono::sys_days sd) {
auto ymd = std::chrono::year_month_day{sd};
std::string date_str = fmt::format("{:%Y-%m-%d}", ymd); // 或手写格式化
if (workday_override.count(date_str)) return true;
if (holiday_list.count(date_str)) return false;
return static_cast<unsigned>(ymd.weekday()) >= 1 && // Mon=1
static_cast<unsigned>(ymd.weekday()) <= 5; // Fri=5
}
容易忽略的边界问题
很多人直接拿系统时区时间做判断,但法定日期是基于北京时间(UTC+8)发布的,如果程序部署在海外服务器,std::chrono::system_clock::now() 可能跨日。务必统一用 std::chrono::utc_clock 或显式转为东八区时间后再截取日期部分。
另外,节假日表通常只覆盖未来 2–3 年,上线前必须检查是否缺失当前年份数据;一旦漏掉某次调休公告,就会把补班日错判为休息日——这种错误往往要等出勤统计报表出来才被发现。

















