C++20中year_month_day为何无法用operator -=减1天?
关于year_month_day的operator -=不支持days的原因
year_month_day是C++20 chrono库中用来表示年、月、日三个日历字段组合的类型,它的设计定位是日历字段的容器,而非代表一个连续的时间点(比如sys_days是将日期转换为从纪元开始的天数,属于连续时间表示)。
它提供的operator -=重载只支持years或months类型的操作数,原因在于:
- 年和月是日历系统的核心字段,直接对这些字段做减法操作符合
year_month_day的使用场景——比如调整到上个月、上一年的同一天(当然要处理月末特殊情况,比如3月31日减1个月会变成2月最后一天)。 - 而
days是时间跨度单位,若要对year_month_day做天数增减,正确的做法是先将它转换为连续时间类型(比如sys_days),完成加减后再转回year_month_day,示例代码如下:
auto tp = zoned_time{current_zone(), now}.get_local_time(); auto dp = floor<days>(tp); year_month_day ymd(dp); // 先转成sys_days,减1天再转回year_month_day ymd = year_month_day{sys_days(ymd) - 1d};
这样设计是为了明确区分日历字段操作和连续时间操作的边界,避免混淆两种不同的时间处理逻辑。
内容的提问来源于stack exchange,提问作者AndrewBloom
相关产品推荐
相关产品推荐

