“该月最后一个有效工作日”指当月最后一个周一至周五且非法定节假日的日期;需用std::chrono提取年月日并判断星期几,再结合自定义节假日表验证是否为当月最晚的有效工作日。

什么是“该月最后一个有效工作日”
它指的是:当月最后一个星期一到星期五中,且不是法定节假日的日期。注意,“有效”隐含了节假日排除逻辑,而“最后一个”必须落在当月范围内——比如 2024 年 10 月 31 日是周四,但若那天是国庆调休上班日,它仍算工作日;若当天是法定假日(如春节初一),则不算。
标准 C++ 标准库(<chrono></chrono>、<ctime></ctime>)不提供节假日判断能力,也不内置工作日计算逻辑,所以必须自行定义或引入外部规则。
用 std::chrono 提取年月日并判断星期几
这是基础步骤:先确认给定日期是否在目标月份内,再检查是否为周一至周五。
-
std::chrono::sys_days可将year_month_day转为绝对天数,方便比较 - 用
weekday获取星期几:wday.index()返回 0(周日)~6(周六),因此工作日对应wd.index() >= 1 && wd.index() - 别直接用
localtime+tm_wday,它依赖时区且易出错;std::chrono::floor<days>(tp)</days>更可靠
auto ymd = year_month_day{floor<days>(tp)}; // tp 是 system_clock::time_point
if (ymd.month() != target_month || ymd.year() != target_year) return false;
weekday wd{ymd};
bool is_weekday = (wd.index() >= 1 && wd.index()
<h3>如何验证它是“该月最后一个”工作日</h3>
<p>不能只看当天是否工作日,还要确认:下一天(<code>ymd + days{1}</code>)要么超出当月,要么不是工作日。</p>
<ul>
<li>先算出该月最后一天:<code>year_month_day{ymd.year()/ymd.month()/month_day_last{}}</code>
</li>
<li>从最后一天开始倒推,找到第一个满足“是工作日且非节假日”的日期;然后比对是否等于输入日期</li>
<li>更稳妥的做法是:遍历当月最后最多 7 天(覆盖所有可能的最后一个工作日范围),检查是否存在比输入日期更晚的有效工作日</li>
<li>注意:跨月边界要小心,<code>year_month_day + days{1}</code> 可能进入下月,此时 <code>ymd.month()</code> 会自动变化,可用 <code>ymd.month() == target_month</code> 判断是否仍在本月</li>
</ul>
<h3>节假日判断必须自己维护或对接外部服务</h3>
<p>C++ 没有内置中国(或其他国家)节假日表。常见做法:</p>
<ul>
<li>硬编码常用节日(如 <code>{2024_y/10_m/1_d, 2024_y/10_m/2_d, ...}</code>),配合调休日(如 2024-09-28 上班)单独标记</li>
<li>读取 JSON 或 CSV 文件加载年度节假日配置,运行时查表</li>
<li>调用 HTTP API(如聚合数据的节假日接口),但需处理网络失败、缓存和时效性</li>
<li>忽略节假日仅判断周末?那 <code>is_weekday</code> 就够了——但业务上通常不行,尤其银行、交易所系统必须严格按公告执行</li>
</ul>
<p>容易被忽略的是:调休日(补班日)要单独维护,它们是工作日但不在自然周内;而法定假日即使落在周末,也常伴随调休,导致实际放假天数≠日历周末数。</p></days>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











