如何用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_REALTIMEstd::chrono::steady_clock→CLOCK_MONOTONICstd::chrono::high_resolution_clock:Linux下通常等价于steady_clock,对应CLOCK_MONOTONIC_RAW,具体取决于编译器实现。
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

