最推荐的方式是调用 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_r 或 gmtime)完成格式化:
- 先用
system_clock::to_time_t(now)转为time_t - 再用线程安全版本(如 Windows 用
localtime_s,Linux/macOS 用localtime_r)转为tm结构体 - 最后用
std::put_time或strftime格式化输出
示例(本地时间):
立即学习“C++免费学习笔记(深入)”;
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_t 和 tm 中转:
- 包含头文件
和 - 用
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 2022 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() 直接当作“毫秒时间戳”理解——它是相对于纪元的总毫秒数,不是当前小时内的毫秒。










