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

使用chrono库查找指定工作日及相关日期处理问题

C++ Chrono库日期操作常见问题解答

1. 查找指定日期当天或之后的下一个指定工作日

核心思路是将输入的年月日转换为chrono日期类型,计算当前星期与目标星期的差值,调整后得到目标日期。

示例代码:

#include <chrono>
#include <iostream>

using namespace std::chrono;

sys_days next_weekday(int year, int month, int day, weekday target) {
    // 将int年月日转换为sys_days
    sys_days input_date = year_month_day{year, month(month), day};
    weekday current_wd = weekday(input_date);
    
    days delta = target - current_wd;
    // 若目标星期在当前星期之前,加7天跳至下一周
    if (delta < days{0}) {
        delta += days{7};
    }
    return input_date + delta;
}

int main() {
    // 示例:2025-04-28(周一)查找下一个周五
    auto result = next_weekday(2025, 4, 28, Friday);
    year_month_day ymd_result{result};
    std::cout << static_cast<int>(ymd_result.year()) << "-"
              << static_cast<unsigned>(ymd_result.month()) << "-"
              << static_cast<unsigned>(ymd_result.day()) << "\n";
    // 输出:2025-5-2
    return 0;
}

输入日期恰好是目标工作日时,会直接返回原日期。


2. 查找指定日期之前的上一个指定工作日

逻辑与“下一个工作日”相反,计算差值后调整为往前推送的天数。

示例代码:

#include <chrono>
#include <iostream>

using namespace std::chrono;

sys_days previous_weekday(int year, int month, int day, weekday target) {
    sys_days input_date = year_month_day{year, month(month), day};
    weekday current_wd = weekday(input_date);
    
    days delta = target - current_wd;
    // 若目标星期在当前星期之后,减7天跳至上一周
    if (delta > days{0}) {
        delta -= days{7};
    }
    return input_date + delta;
}

int main() {
    // 示例:2025-05-03(周六)查找上一个周五
    auto result = previous_weekday(2025, 5, 3, Friday);
    year_month_day ymd_result{result};
    std::cout << static_cast<int>(ymd_result.year()) << "-"
              << static_cast<unsigned>(ymd_result.month()) << "-"
              << static_cast<unsigned>(ymd_result.day()) << "\n";
    // 输出:2025-5-2
    return 0;
}

输入日期是目标工作日时,直接返回原日期。


3. 传入int年月日,处理后返回int类型日期数值

完全可以实现,只需在chrono日期类型和int之间做转换,常用year_month_day作为中间转换载体。

示例代码:

#include <chrono>
#include <tuple>

using namespace std::chrono;

// 用tuple封装返回的年、月、日int值
std::tuple<int, int, int> process_date(int year, int month, int day, weekday target, bool find_next) {
    sys_days input_date = year_month_day{year, month(month), day};
    sys_days result_date;
    
    weekday current_wd = weekday(input_date);
    days delta = target - current_wd;
    
    if (find_next) {
        if (delta < days{0}) delta += days{7};
        result_date = input_date + delta;
    } else {
        if (delta > days{0}) delta -= days{7};
        result_date = input_date + delta;
    }
    
    year_month_day ymd_result{result_date};
    return {
        static_cast<int>(ymd_result.year()),
        static_cast<unsigned>(ymd_result.month()),
        static_cast<unsigned>(ymd_result.day())
    };
}

int main() {
    auto [res_year, res_month, res_day] = process_date(2025, 4, 28, Friday, true);
    // res_year=2025, res_month=5, res_day=2
    return 0;
}

也可以自定义结构体替代tuple返回结果,提升可读性。


4. 输入日期为目标工作日时,控制返回原日期或一周后

通过调整差值的判断条件,即可实现两种需求:

返回原日期(包含当前)

输入日期是目标工作日时直接返回原日期:

sys_days next_weekday_include_current(int year, int month, int day, weekday target) {
    sys_days input_date = year_month_day{year, month(month), day};
    weekday current_wd = weekday(input_date);
    days delta = target - current_wd;
    if (delta < days{0}) {
        delta += days{7};
    }
    return input_date + delta;
}

返回一周后的该工作日(排除当前)

输入日期是目标工作日时返回下一周的同一天:

sys_days next_weekday_exclude_current(int year, int month, int day, weekday target) {
    sys_days input_date = year_month_day{year, month(month), day};
    weekday current_wd = weekday(input_date);
    days delta = target - current_wd;
    if (delta <= days{0}) {
        delta += days{7};
    }
    return input_date + delta;
}

也可以添加布尔参数(如bool return_current)整合两种逻辑,根据参数动态调整判断条件。


内容的提问来源于stack exchange,提问作者Howard Hinnant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 08:49:55