最常用方式是用std::chrono::system_clock::now()获取时间点,再通过to_time_t转为time_t输出可读时间;该时间受系统调整影响,不适用于间隔测量。

用 std::chrono::system_clock 获取当前系统时间(秒级)
最常用、最直接的方式是通过 std::chrono::system_clock 获取自纪元(1970-01-01 00:00:00 UTC)以来的时间点,再转成 time_t 格式输出可读时间。
注意:它返回的是系统时钟时间,受系统时间调整(如 NTP 同步、手动修改)影响,不适用于测量间隔。
auto now = std::chrono::system_clock::now(); auto time_t = std::chrono::system_clock::to_time_t(now); std::cout << std::put_time(std::localtime(&time_t), "%Y-%m-%d %H:%M:%S") << std::endl;
-
std::chrono::system_clock::now()返回time_point,精度取决于平台(Linux 通常纳秒,Windows 通常 15.6ms) -
std::put_time需要<iomanip></iomanip>和<ctime></ctime> -
std::localtime不是线程安全的;多线程中建议用std::localtime_r(POSIX)或_localtime64_s(MSVC)
用 std::chrono::steady_clock 获取高精度单调时间戳(推荐测时)
如果你真正需要“高精度”且“不受系统时间跳变影响”的时间戳(比如性能计时、超时控制),std::chrono::steady_clock 才是正确选择。
它从某个未指定起点开始单调递增,精度通常优于 system_clock,且不会因时钟校正而倒退或突变。
立即学习“C++免费学习笔记(深入)”;
auto start = std::chrono::steady_clock::now(); // ... do something ... auto end = std::chrono::steady_clock::now(); auto duration_ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
- 差值运算(
end - start)返回duration类型,必须显式转换才能获取整数值 -
std::chrono::nanoseconds、microseconds、milliseconds等都是合法的duration_cast目标类型 - 不要把
steady_clock::time_point转成time_t—— 它没有纪元定义,转换无意义
跨平台纳秒级时间戳:用 std::chrono::high_resolution_clock 要小心
std::chrono::high_resolution_clock 在 C++11 中是个“别名”,实际类型由标准库实现决定:GCC/Clang 下常映射为 steady_clock,MSVC 下早期版本可能映射为 system_clock。
这意味着它**不保证单调性,也不保证高精度**——名字有误导性,不建议依赖。
- C++20 起已标记为 deprecated,应避免使用
- 想高精度 + 单调 → 用
steady_clock - 想高精度 + 可读时间 → 用
system_clock,再配合file_clock(C++20)或第三方库(如date.h)做时区/格式化 - 若需纳秒级原始整数(如日志打点),可直接取
time_since_epoch().count():
auto ns = std::chrono::steady_clock::now().time_since_epoch().count(); // 返回纳秒数(类型通常是 long long)
常见错误:混用 clock 类型或忽略精度截断
下面这些写法看着合理,实则埋坑:
- 对
steady_clock::now()调用to_time_t()→ 编译失败,该函数只对system_clock定义 - 用
auto t = system_clock::now().time_since_epoch().count()当作“纳秒时间戳”用于排序 → 错!system_clock在 Windows 上底层是GetSystemTimeAsFileTime,分辨率约 100ns,但count()返回的是 100ns 单位,不是纳秒 - 在循环里反复调用
system_clock::now()并格式化 → 性能差,std::put_time+localtime开销不小,高频打点应先存time_point,最后批量格式化
真正需要高精度、跨平台、带时区的系统时间,std::chrono 原生能力有限,得靠 Howard Hinnant’s date library 或 C++20 的 <chrono></chrono> 扩展。基础场景下,分清 system_clock(挂钟)和 steady_clock(计时器)就够了。











