time_of_day 不是 c++ 标准库组件,而是 howard hinnant date 库中的非标准类型,定义在 中,用于封装一天内的时间点并支持格式化访问;标准 std::chrono 仅提供持续时间类型如 hours、minutes。

time_of_day 不是 C++ 标准库 std::chrono 的一部分 —— 它根本不存在于 ISO C++20 或 C++23 标准中。
为什么搜不到 time_of_day?它压根不是标准 chrono 组件
很多人在查“C++ 获取当天几点几分”时,被某些博客或 Stack Overflow 旧回答误导,以为 time_of_day 是 std::chrono 的官方类型。实际上,它是 Howard Hinnant 的 date 库(一个广泛使用的、非标准但事实上的 chrono 扩展)里定义的类模板,头文件为 <date></date>。
如果你没显式引入 date 库,只用了 <chrono></chrono> 和 <ctime></ctime>,编译器会直接报错:‘time_of_day’ was not declared in this scope。
- 标准
std::chrono提供的是std::chrono::hours、std::chrono::minutes等持续时间类型,不提供“带 AM/PM 或格式化语义的‘时间-of-day’抽象” -
date::time_of_day<duration></duration>是对Duration(如std::chrono::seconds)的封装,支持.hours()、.minutes()、.subseconds()等成员访问 - 它的主要用途是配合
date::sys_days构造完整时间点,比如sys_days{2024y/June/15} + time_of_day{14h + 30min}
如何正确使用 date::time_of_day?三步走
前提是已安装并链接 Howard Hinnant 的 date 库(推荐用 vcpkg 或 conan 安装,或直接包含单头文件 date.h)。
- 包含头文件:
#include <date></date>(注意不是<chrono></chrono>) - 使用命名空间:
using namespace date;或显式写date::time_of_day<:chrono::seconds></:chrono::seconds> - 构造方式示例:
auto t = time_of_day<:chrono::seconds>{14h + 30min + 5s};<br>std::cout </:chrono::seconds> - 注意:
time_of_day默认以std::chrono::seconds为模板参数,所以time_of_day{14h}等价于time_of_day<seconds>{14h}</seconds>;若需毫秒精度,得写time_of_day<milliseconds>{14h + 30min + 5000ms}</milliseconds>
想从系统时间提取“今天几点”?别硬套 time_of_day
常见需求其实是“获取当前时刻的时分秒”,这时候直接用 std::chrono + std::time_t 更轻量、无依赖:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
auto now = std::chrono::system_clock::now();<br>std::time_t t = std::chrono::system_clock::to_time_t(now);<br>std::tm tm = *std::localtime(&t);<br>std::cout <p>如果坚持用 date 库做这件事,更推荐组合 <code>floor<seconds>(now)</seconds></code> 和 <code>make_time</code>:</p>
-
auto t = floor<:chrono::seconds>(now);</:chrono::seconds>截断到秒级 -
auto tod = make_time(t.time_since_epoch());得到time_of_day<seconds></seconds> - 再调用
tod.hours().count()等取整数部分
但要注意:make_time 返回的是基于 epoch 起始的 time_of_day,和本地时区无关 —— 若需本地时间,必须先用 zoned_time 转换时区,否则可能差 8 小时。
容易踩的坑:模板参数、时区、头文件路径
time_of_day 的行为高度依赖模板参数和上下文,几个高频翻车点:
- 忘记
#include <date></date>,只 include<chrono></chrono>→ 编译失败 - 误用
std::chrono::time_of_day(加了std::chrono::前缀)→ 名字查找失败 - 构造时传入负值(如
time_of_day{-1h})不会报错,但后续格式化可能出意外(比如显示 23:00:00 而非 -01:00:00) - 用
time_of_day<milliseconds></milliseconds>构造后,调用.hours()返回的是std::chrono::hours类型,不能直接 cout,得写.hours().count() - date 库默认不启用时区支持;若要用
zoned_time或本地时间,必须额外定义DATE_BUILD_TZ_LIB并链接 tz 库
真正需要 time_of_day 的场景其实很窄:多是配合 date 库做日历运算或高精度时间解析。日常取“几点几分”,用 std::tm 更稳,也更少依赖外部库。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










