如何为C++20中std::chrono的year_month_day对象增加1天?
用C++20的std::chrono::year_month_day计算次日的方法
虽然year_month_day本身没有直接提供加一天的成员函数,但可以通过chrono库内的类型转换完成需求,全程基于year_month_day相关组件实现,无需额外依赖其他库。
核心思路
将year_month_day转换为sys_days(表示从1970-01-01起的天数的时间点类型),利用时间点支持加减时长的特性加1天,再转换回year_month_day即可。这个过程会自动处理闰年、月末、跨年等边界情况。
代码示例
#include <chrono> #include <iostream> int main() { // 给定年、月、日整数 int year = 2024, month = 2, day = 28; std::chrono::year_month_day ymd{ std::chrono::year{year}, std::chrono::month{month}, std::chrono::day{day} }; // 先验证日期有效性(可选但推荐) if (!ymd.ok()) { std::cerr << "输入日期无效" << std::endl; return 1; } // 计算次日 auto next_day = std::chrono::year_month_day{ std::chrono::sys_days{ymd} + std::chrono::days{1} }; // 输出结果 std::cout << "次日日期:" << static_cast<int>(next_day.year()) << "-" << static_cast<unsigned>(next_day.month()) << "-" << static_cast<unsigned>(next_day.day()) << std::endl; return 0; }
关键说明
sys_days是chrono库中与系统时间对齐的时间点类型,天然支持和days类型的时长做加减运算。- 转换过程会自动处理所有日期边界:比如2024-02-28加1天得到2024-02-29,2023-12-31加1天得到2024-01-01。
- 建议先调用
ymd.ok()验证输入日期的合法性,避免无效日期导致的未定义行为。
内容的提问来源于stack exchange,提问作者Woody20
相关产品推荐
相关产品推荐

