节假日判断必须依赖外部数据而非算法推导,可行方案仅有本地节假日表或第三方API;需用结构体封装日期、是否法定假日、是否调休工作日,并为每一年单独整理完整日历。

节假日判断不能靠算法推导,必须依赖外部数据
所有“用公式算出某天是不是节假日”的想法都不可靠。法定节假日每年由国务院发布,调休安排每年不同,连春节初一在哪天都可能因农历闰月变化。C++ 标准库不提供节假日信息,std::chrono 只处理时间计算,不包含任何节假日语义。
真正可行的方式只有两种:本地维护节假日表,或调用第三方 API(如国家政务服务平台、聚合数据等)。基础逻辑的第一步,就是放弃“用 C++ 算出来”这个念头。
最简可行方案:用静态数组存已知年份的节假日
适合内部工具、离线场景、年份范围固定(比如只处理 2020–2025)。核心是把国务院公开文件整理成 std::set<:string></:string> 或 std::unordered_set<int></int>(用 YYYYMMDD 整数表示日期)。
-
20240128、20240129是春节调休上班日(不算节假日) -
20240210到20240217是春节假期(含调休补班日需单独标记) - 周末(周六/周日)默认不是节假日,但遇到调休时可能变成工作日——所以不能只查周末
- 建议用结构体封装:{ date: int, is_holiday: bool, is_workday_by_adjustment: bool }
示例片段:
立即学习“C++免费学习笔记(深入)”;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
struct HolidayInfo {
int yyyymmdd;
bool is_official_holiday;
bool is_workday_despite_weekend;
};
const std::vector<HolidayInfo> holidays_2024 = {
{20240128, false, true}, // 周日上班
{20240210, true, true}, // 春节第一天,周六但放假
{20240214, true, false}, // 情人节?不,春节中,但那天是周三,正常放
};用 std::tm 和 mktime 提取年月日再查表
别用字符串拼接来生成 yyyymmdd,容易出错。标准做法是把 time_t 转为 std::tm,再安全提取年、月、日字段:
-
tm_year是从 1900 开始的,要加+1900 -
tm_mon是 0–11,要+1 -
tm_mday是 1–31,直接可用 - 组合成整数:
int key = (t.tm_year + 1900) * 10000 + (t.tm_mon + 1) * 100 + t.tm_mday;
注意:mktime 会修改 tm_wday(星期几),但节假日判断不依赖它——因为调休已打乱自然周末与放假的关系。
容易被忽略的关键点:调休日比节假日本身更难处理
很多人只存放假日期,忘了补班日。结果导致:系统把周日当成休息日,但那天实际要上班;或者把周五当成工作日,但它其实是调休放假日。
- 国务院通知里明确写了“2月3日(星期六)上班”,这就是
is_workday_despite_weekend == true - 同一日期,在不同年份可能角色不同(比如某周六今年放假、明年上班)
- 没有通用规则可简化:五一调休模式每年变,春节前后跨度大,清明/端午/中秋单日但常与周末拼接
所以,哪怕只支持三年,也要为每一年单独整理完整日历——少一个调休日,业务就可能发错通知、记错考勤。

















