如何使用C++20 <chrono>计算两个year_month_day对象的天数差?
在C++20 中计算两个year_month_day的天数差值
year_month_day属于日历日期类型,无法直接相减得到天数差,必须先将其转换为代表系统时间天数的sys_days类型,再进行减法运算。另外还要考虑当前日期已过当年圣诞节的情况,避免得到负数差值。
修正后的完整代码如下:
#include <chrono> #include <iostream> int main() { using namespace std::chrono; const auto now = system_clock::now(); const year_month_day today = floor<days>(now); // 先构造当年的圣诞节日期 year_month_day xmas = today.year() / December / 25; // 如果今天已经过了圣诞节,就取明年的圣诞节 if (xmas < today) { xmas = (today.year() + years{1}) / December / 25; } // 转换为sys_days后再计算差值 const days days_till_xmas = sys_days{xmas} - sys_days{today}; // 输出结果,count()获取天数数值 std::cout << "距离圣诞节还有 " << days_till_xmas.count() << " 天\n"; }
关键说明:
sys_days是C++20中表示从系统纪元(通常是1970-01-01)开始的天数计数类型,它支持减法运算,结果为 days类型。- 直接对
year_month_day做减法会编译报错,因为该类型没有定义减法运算符来返回days。 - 判断
xmas < today可以处理跨年情况,确保计算的是下一个圣诞节的剩余天数。
内容的提问来源于stack exchange,提问作者user13692250
相关产品推荐
相关产品推荐

