You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C++的<chrono>库获取某月的第N个指定工作日?

如何用C++的库获取某月的第N个指定工作日?

嘿,关于用C++的库找某月的第N个指定星期几这个问题,我刚好有靠谱的解决方案,而且写法超直观,咱们一起来看看:

1. 定位某月的第N个指定星期几

C++20引入的库新增了一堆实用的日期处理工具类,直接就能构造出我们要的目标日期。比如你要找2025年6月的第二个周日,代码可以这么写:

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:28:17