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

为何这段std::chrono::year_month_day_last代码无法编译?

解决C++20获取当月最后一天的编译错误

错误原因

原代码中std::chrono::floor<std::chrono::months>(now)返回的是std::chrono::sys_time<std::chrono::months>类型,C++20标准中没有提供从该类型直接到std::chrono::year_month_day的转换构造函数,因此触发C2440类型转换错误。

修正方案

方案1:转换为sys_days后构造year_month_day

将月份对齐后的时间转换为sys_days类型,再用它初始化year_month_day:

#include <chrono>

int main() {
    auto now = std::chrono::system_clock::now();
    // 获取当月起始时间的sys_time<months>
    auto month_start = std::chrono::floor<std::chrono::months>(now);
    // 转换为sys_days后构造year_month_day
    auto ymd = std::chrono::year_month_day(std::chrono::sys_days{month_start});
    // 构造当月最后一天的year_month_day_last
    auto last_day = std::chrono::year_month_day_last{ymd.year(), ymd.month()};
    
    // 若需将last_day转为可计算的时间点,可转为sys_days
    auto last_day_time = std::chrono::sys_days{last_day};
}

方案2:基于当前日期的year_month构造

先获取当前日期的year_month_day,再提取年份和月份构造当月最后一天,逻辑更简洁:

#include <chrono>

int main() {
    auto now = std::chrono::system_clock::now();
    // 先获取当前日期的year_month_day
    auto ymd = std::chrono::year_month_day{std::chrono::floor<std::chrono::days>(now)};
    // 直接用年份和月份构造当月最后一天
    auto last_day = std::chrono::year_month_day_last{ymd.year(), ymd.month()};
}

两种方案均符合C++20标准,可正常编译运行,根据实际场景选择即可。

内容的提问来源于stack exchange,提问作者Andrew Truckle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:42:09