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

如何用std::chrono创建不关联特定时钟的日期时间类型?

std::chrono日期时间类型选型与常见问题解答

1. 无需绑定特定clock_gettime实现的类型选择

  • 若处理日历墙钟时间(如你给出的"2025-02-09T15:39:00.123456789+0000"格式字符串),优先用std::chrono::system_clock::time_point。它对应Linux的CLOCK_REALTIME,天生适配真实世界的日期时间表示,是字符串互转的最优选择。
  • 若完全不需要关联系统时钟,仅需存储时间点数值,可自定义无now()的时钟类型:
struct custom_clock {
    using rep = std::int64_t;
    using period = std::nano;
    using duration = std::chrono::duration<rep, period>;
    using time_point = std::chrono::time_point<custom_clock>;
    static constexpr bool is_steady = false; // 按需设置是否单调
    // 不提供now()函数,时间点完全由外部赋值(如JSON解析结果)
};

2. 无now()实现的std::chrono时钟

标准库自带的system_clock、steady_clock、high_resolution_clock都有now(),但自定义时钟可以不实现now()。C++标准仅要求时钟类型包含rep、period、duration、time_point、is_steady这些类型别名,没有强制要求提供now()接口。

3. 日期字符串转time_point的Clock选择

你要解析的是UTC日历时间,必须选system_clock:

  • system_clock的时间点可与Unix时间戳互转,C20+可直接用std::chrono::parse和std::format完成字符串与时间点的双向转换;C20之前可借助第三方日期库实现。
  • steady_clock是单调时钟,用于测量时间间隔(如性能计时),它的起点是系统启动类的非固定时间,无法对应具体的日历日期,完全不适合你的场景。

补充:Linux下std::chrono时钟与clock_gettime的映射

  • std::chrono::system_clock → CLOCK_REALTIME
  • std::chrono::steady_clock → CLOCK_MONOTONIC
  • std::chrono::high_resolution_clock:Linux下通常等价于steady_clock,对应CLOCK_MONOTONIC_RAW,具体取决于编译器实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 10:47:45