最推荐的方式是调用 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 风格转换)借助 std::chrono::system_clock::to_time_t
和 C 标准库函数(如 localtime_s / localtime_r 或 gmtime)完成格式化:
system_clock::to_time_t(now) 转为 time_t
localtime_s,Linux/macOS 用 localtime_r)转为 tm 结构体std::put_time 或 strftime 格式化输出
示例(本地时间):
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 标准支持直接格式化 time_point,无需经过 time_t 和 tm 中转:
和
std::format(std::chrono::system_clock::now(), u8"%Y-%m-%d %H:%M:%S")
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() 直接当作“毫秒时间戳”理解——它是相对于纪元的总毫秒数,不是当前小时内的毫秒。