std::chrono::years是C++20标准库中chrono头文件下定义的时间持续时间类型,专门用于表示以年为单位的时长,解决了以往使用自定义整数或通用时长类型处理年度计算时缺乏语义明确性和类型安全的问题。它属于chrono库中有符号的整数类型时长,底层存储通常为有符号整数,支持正负值表示过去或未来的年份跨度。

std::chrono::years的基本定义与特性
std::chrono::years的定义基于chrono库的时长模板,其原型可以简化理解为duration<有符号整数类型, ratio<31556952>>,其中ratio的分母对应平均一年的秒数(考虑闰年的平均情况)。它具备以下核心特性:
- 类型安全:只能参与时间相关的运算,无法和其他无关类型混用
- 语义明确:代码中出现该类型时,能直接明确是年度相关的时长
- 支持基础运算:可以和同类型、时间点类型进行加减乘除等操作
基础用法示例
创建std::chrono::years实例
可以通过字面量或者构造函数的形式创建该类型的实例,C++20为chrono库引入了时间字面量,使用起来更加便捷:
#include <chrono>
#include <iostream>
int main() {
// 使用字面量创建,需要引入chrono_literals命名空间
using namespace std::chrono_literals;
std::chrono::years y1 = 3y; // 表示3年时长
std::chrono::years y2(5); // 使用构造函数创建5年时长的实例
std::chrono::years y3 = -2y; // 表示负2年,即过去2年
std::cout << "y1 count: " << y1.count() << std::endl; // 输出3
std::cout << "y2 count: " << y2.count() << std::endl; // 输出5
std::cout << "y3 count: " << y3.count() << std::endl; // 输出-2
return 0;
}
年度计算常见场景
计算两个日期的年份差
结合std::chrono::sys_days时间点类型,可以计算两个日期之间的年份跨度:
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono;
// 定义两个日期,2020年1月1日和2023年1月1日
sys_days date1 = sys_days{2020y/January/1};
sys_days date2 = sys_days{2023y/January/1};
// 计算时间差并转换为years类型
years diff = duration_cast<years>(date2 - date1);
std::cout << "两个日期相差: " << diff.count() << "年" << std::endl; // 输出3
return 0;
}
日期的年度偏移计算
可以通过给时间点加上或减去std::chrono::years实例,得到偏移后的日期:
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono;
using namespace std::chrono_literals;
// 基准日期2022年6月15日
sys_days base_date = sys_days{2022y/June/15};
// 加3年
sys_days future_date = base_date + 3y;
// 减2年
sys_days past_date = base_date - 2y;
std::cout << "基准日期加3年: " << year_month_day{future_date} << std::endl; // 输出2025-06-15
std::cout << "基准日期减2年: " << year_month_day{past_date} << std::endl; // 输出2020-06-15
return 0;
}
使用注意事项
- std::chrono::years表示的是平均年的时长,不是精确的日历年的概念,比如加1年并不一定会让月份和日期完全相同,比如2020年2月29日加1年得到2021年2月28日
- 进行时长转换时,如果需要精确到年,建议使用duration_cast<years>进行显式转换,避免隐式转换带来的精度损失
- 不要将std::chrono::years和自定义的年份整数直接混用运算,尽量保持类型统一,提升代码可读性和安全性
和其他时间类型的转换
std::chrono::years可以和月、日、小时等时长类型进行转换,但是需要注意转换的精度问题:
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono;
using namespace std::chrono_literals;
years y = 2y;
// 转换为月数,1年=12个月
months m = duration_cast<months>(y);
// 转换为天数,平均1年约365.2425天
days d = duration_cast<days>(y);
std::cout << "2年转换为月数: " << m.count() << std::endl; // 输出24
std::cout << "2年转换为天数: " << d.count() << std::endl; // 输出730
return 0;
}
std::chrono::yearsC++20时间库年度计算修改时间:2026-07-13 03:33:24