C++如何获取当前时间?(chrono库使用教程)

最推荐的方式是调用 std::chrono::system_clock::now() 获取高精度跨平台时间点,再通过 to_time_t 转换为 time_t,结合线程安全的 localtime_s/localtime_r 转为 tm,最后用 std::put_time 格式化输出。

std::chrono 获取当前时间最推荐的方式是调用 std::chrono::system_clock::now(),它返回一个高精度、跨平台的时间点(time_point),再配合格式化转换就能得到可读的时间字符串。

获取系统当前时间点

std::chrono::system_clock::now() 是 C++11 引入的标准方式,代表自纪元(通常是 1970-01-01 00:00:00 UTC)以来的时间。它不依赖本地时区,但可转换为本地时间。

  • 返回类型是 std::chrono::time_point<:chrono::system_clock>
  • 精度由实现决定(通常为纳秒或微秒),可用 time_since_epoch().count() 提取底层计数值
  • 不能直接输出,需转为 std::time_t 或使用 C++20 的 (或传统 C 风格转换)

转成可读的日期时间字符串(C++11/14/17)

借助 std::chrono::system_clock::to_time_t 和 C 标准库函数(如 localtime_s / localtime_rgmtime)完成格式化:

  • 先用 system_clock::to_time_t(now) 转为 time_t
  • 再用线程安全版本(如 Windows 用 localtime_s,Linux/macOS 用 localtime_r)转为 tm 结构体
  • 最后用 std::put_timestrftime 格式化输出

示例(本地时间):

auto now = std::chrono::system_clock::now();
std::time_t t = std::chrono::system_clock::to_time_t(now);
std::tm tm{};
#ifdef _WIN32
    localtime_s(&tm, &t);
#else
    localtime_r(&t, &tm);
#endif
std::cout << std::put_time(&tm, "%Y-%m-%d %H:%M:%S") << '\n';

C++20 起更简洁的方式:使用 +

C++20 标准支持直接格式化 time_point,无需经过 time_ttm 中转:

  • 包含头文件
  • std::format(std::chrono::system_clock::now(), u8"%Y-%m-%d %H:%M:%S")
  • 自动处理时区(默认为本地时区),也支持 UTC:std::chrono::utc_clock::now()

注意:需编译器支持(GCC 13+、Clang 15+、MSVC 2025 17.4+),并开启 -std=c++20

获取毫秒/微秒级时间戳(适合日志或性能测量)

若只需数字形式的时间戳(如记录毫秒数),可直接从 time_point 提取:

  • auto ms = std::chrono::duration_cast<:chrono::milliseconds>(now.time_since_epoch()).count();
  • auto us = std::chrono::duration_cast<:chrono::microseconds>(now.time_since_epoch()).count();
  • 这类整数适合日志前缀、计时差值计算,也便于序列化存储

注意:不要用 count() 直接当作“毫秒时间戳”理解——它是相对于纪元的总毫秒数,不是当前小时内的毫秒。