为何这段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
相关产品推荐
相关产品推荐

