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

C++中如何存储任意时长?求类似Java Period的解决方案

哥们,你问的这个问题戳中了C++标准库的一个小痛点——确实没有像Java里Period那样直接就能用的类型,来存年、月、日、周这种时长不固定的时间间隔。毕竟std::chrono里的millis、micros这些都是基于固定时间单位的,没法处理月有28-31天、年有365/366天这种「浮动」的情况。不过有几个靠谱的方案可以解决:

1. C++20及以上:用标准库自带的日历组件组合

C++20给<chrono>加了日历扩展,专门提供了std::chrono::years、std::chrono::months、std::chrono::days这些处理日历单位的类型(注意它们和普通duration不一样,属于「日历时长」,不能直接转成固定毫秒数,因为得结合具体日期才能算出准确时长)。你可以用一个自定义结构体把这些单位打包,模拟Period的功能:

#include <chrono>

struct Period {
    std::chrono::years years{};
    std::chrono::months months{};
    std::chrono::days days{};

    // 重载加法,和具体日期结合计算结果
    friend auto operator+(const std::chrono::year_month_day& date, const Period& p) {
        return date + p.years + p.months + p.days;
    }
};

比如你可以创建Period{std::chrono::years(2), std::chrono::months(3), std::chrono::days(15)}来表示2年3个月15天,和std::chrono::year_month_day{2024, 1, 31}相加的话,会自动处理闰年、月份天数,得到准确的2026年5月15日,完全不用自己操心细节。

2. 自定义Period类型(兼容C++11/14/17)

如果你的项目还没法升级到C20,那最稳妥的方式就是自己封装一个结构体,包含年、月、日、周这些字段,再实现必要的操作逻辑。要是需要准确的日期计算,建议搭配轻量的第三方日期库(比如Howard Hinnant的date库,它是C20日历组件的前身,支持C++11及以上),不用自己啃闰年、月份天数这些复杂逻辑。

举个简化版的自定义结构体例子:

#include <cstdint>

struct Period {
    int64_t years = 0;
    int64_t months = 0;
    int64_t days = 0;
    int64_t weeks = 0;

    // 把周转换成天(可选的归一化操作)
    void normalize_weeks() {
        days += weeks * 7;
        weeks = 0;
    }

    // 这里可以添加和日期类型的加减逻辑,搭配第三方日期库实现准确计算
};

3. 别踩这个坑:别强行转成duration<double>

你提到可以把所有时长转成duration<double>,这种方式只适合不需要精确日历对齐的场景(比如粗略估算时长)。因为把1个月近似成30.4375天这种平均值,在和具体日期结合时肯定会出错——比如2024年1月31日加1个月,用近似值算会得到3月1日,但实际应该是2月29日(2024是闰年)。所以这种方案绝对不能用来处理业务中的精确日期计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:04:02