c++如何获取当前系统时间_c++ chrono库高精度时间戳获取【方法】

最常用方式是用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 需要
  • std::localtime 不是线程安全的;多线程中建议用 std::localtime_r(POSIX)或 _localtime64_s(MSVC)

std::chrono::steady_clock 获取高精度单调时间戳(推荐测时)

如果你真正需要“高精度”且“不受系统时间跳变影响”的时间戳(比如性能计时、超时控制),std::chrono::steady_clock 才是正确选择。

它从某个未指定起点开始单调递增,精度通常优于 system_clock,且不会因时钟校正而倒退或突变

auto start = std::chrono::steady_clock::now();
// ... do something ...
auto end = std::chrono::steady_clock::now();
auto duration_ms = std::chrono::duration_cast(end - start).count();
  • 差值运算(end - start)返回 duration 类型,必须显式转换才能获取整数值
  • std::chrono::nanosecondsmicrosecondsmilliseconds 等都是合法的 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 的 扩展。基础场景下,分清 system_clock(挂钟)和 steady_clock(计时器)就够了。