如何用C++的<chrono>库获取某月的第N个指定工作日?
如何用C++的库获取某月的第N个指定工作日?
嘿,关于用C++的
1. 定位某月的第N个指定星期几
C++20引入的
#include <chrono> #include <iostream> #include <stdexcept> using namespace std::chrono; int main() { // 直接构造目标日期:2025年6月的第二个周日 auto target_date = year{2025}/June/Sunday[2]; // 先检查这个日期是否合法(比如某个月可能没有第5个周五) if (target_date.ok()) { // 转换为sys_days类型,方便后续处理 auto sys_date = sys_days{target_date}; // 转成year_month_day格式,输出更友好的日期 auto ymd = year_month_day{sys_date}; std::cout << "2025年6月第二个周日是:" << ymd.year() << "年" << static_cast<unsigned>(ymd.month()) << "月" << static_cast<unsigned>(ymd.day()) << "日" << std::endl; } else { throw std::invalid_argument("这个月份不存在第N个指定的星期几哦!"); } return 0; }
你看,直接用year{年份}/月份/星期几[N]的语法就能构造目标,是不是特别省事?
2. 处理“不存在第N个星期几”的情况
就像你问的,如果某个月没有第5个指定星期几怎么办?比如2024年2月最多只有4个周一,这时候我们构造的year_month_weekday对象的ok()成员函数会返回false。
所以在代码里只需要先调用ok()做合法性检查,如果不合法,就可以抛出异常、打印错误提示,或者做你需要的其他错误处理,完全不用担心拿到无效日期。
3. 获取某月的最后一个指定星期几
如果想找某月的最后一个星期几(比如最后一个周六),[last]标记就行,代码示例:
// 构造2025年6月的最后一个周日 auto last_sunday = year{2025}/June/Sunday[last]; if (last_sunday.ok()) { auto ymd = year_month_day{sys_days{last_sunday}}; std::cout << "2025年6月最后一个周日是:" << ymd.year() << "年" << static_cast<unsigned>(ymd.month()) << "月" << static_cast<unsigned>(ymd.day()) << "日" << std::endl; }
同样,ok()检查也适用这里,不过一般来说每个月至少有4个星期几,所以最后一个几乎都是合法的,但加上检查会更稳妥。
小提醒
要注意这些特性是C20才支持的,所以编译代码的时候要开启C20标准,比如GCC/Clang加参数-std=c++20,MSVC加/std:c++20。
备注:内容来源于stack exchange,提问作者Howard Hinnant
相关产品推荐
相关产品推荐

