c++标准库无法直接判断节假日,必须依赖外部json数据源或api;推荐使用nlohmann/json解析每年更新的holidays-cn数据,按"yyyy-mm-dd"查type字段区分holiday/workday/weekend,并缓存年份与日期结果以提升性能。

节假日判断不能靠C++标准库直接实现
C++标准库(包括<chrono></chrono>、<ctime></ctime>)不包含任何节假日数据或规则。所谓“法定节假日”是国家行政定义的,每年由国务院发布通知调整,涉及调休、补班等动态规则,纯代码无法推导。你必须引入外部数据源或服务。
推荐方案:用轻量级节假日JSON数据 + 日期解析
国内已有维护良好的开源节假日数据集(如 GitHub 上的 holidays-cn),每年更新 JSON 文件,包含:date、name、type("holiday"/"workday"/"weekend")。你需要:
- 下载最新年份的
holidays.json(例如2024.json),或集成 HTTP 接口(如https://api.apihubs.cn/holiday/) - 用 C++ 解析 JSON —— 推荐
nlohmann/json库,支持std::string或std::ifstream直接加载 - 将输入日期格式化为
"YYYY-MM-DD"字符串(注意补零),再查表
示例片段:
#include <nlohmann>
using json = nlohmann::json;
bool isHoliday(const std::string& ymd) { // ymd = "2024-10-01"
auto j = json::parse(std::ifstream("2024.json"));
if (j.contains(ymd)) {
return j[ymd]["type"] == "holiday";
}
// fallback:先判断是否周末(周六=6,周日=0)
auto tp = parse_ymd_to_time_point(ymd); // 自行实现或用 <code>std::chrono</code> + <code>std::tm</code>
auto wd = weekday_of(tp); // 返回 0~6
return wd == 0 || wd == 6;
}</nlohmann>
工作日判断要区分“自然周末”和“调休上班日”
国务院通知中常见“9月29日(星期日)上班”,这类日期在日历上是周日,但属于workday;反之,“2月3日(星期六)放假”则是holiday。仅靠 std::tm::tm_wday 判断周末会出错。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
关键点:
- 节假日 JSON 中的
type字段必须覆盖三类:"holiday"、"workday"、"weekend"(后者表示未被调休影响的原始周末) - 若数据里没有某天记录,默认按自然星期判断(即
tm_wday == 0 || tm_wday == 6→ 周末,否则工作日) - 务必检查数据时效性——2025年节假日尚未发布时,不要硬编码逻辑推算清明/中秋等节气相关节日
跨年与性能注意事项
节假日数据按年组织,但用户可能传入跨年日期(如 "2025-01-01")。别假设单个 JSON 文件覆盖全部需求:
- 构建一个
std::map<int json></int>缓存已加载年份,按需加载(避免启动时全量读取) - 对高频调用场景(如日志系统逐秒判断),加一层
std::unordered_map<:string bool></:string>缓存结果,key 是"YYYY-MM-DD" - 注意 Windows 下
std::filesystem::last_write_time可用于检测 JSON 是否过期,Linux 需配合stat()
真正麻烦的不是解析,而是数据更新滞后和调休规则变动——去年国庆调休安排和今年可能完全不同,这部分没法靠代码绕过去。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










