最常用方式是调用std::chrono::system_clock::now()获取time_point,再通过to_time_t()转为time_t才能格式化输出;直接打印time_point会导致编译失败或无意义数值。
std::chrono::system_clock 获取当前系统时间(秒级精度)最常用也最直接的方式是调用 std::chrono::system_clock::now(),它返回一个 time_point,代表自纪元(通常是 1970-01-01 00:00:00 UTC)以来的时间。注意:这个值本身不是“可读时间”,要转成 time_t 才能用 std::ctime 或 std::strftime 格式化。
常见错误是直接打印 time_point 对象,结果是编译失败或输出无意义的数值(比如纳秒计数)。
.time_since_epoch().count() 查看底层计数值(调试用),但生产中应转为 time_t
std::chrono::system_clock::to_time_t()
auto now = std::chrono::system_clock::now(); std::time_t t = std::chrono::system_clock::to_time_t(now); std::cout << std::ctime(&t); // 输出类似 "Wed Apr 10 15:23:41 2024\n"
std::time() 精度不足)std::time() 只能到秒,而 std::chrono 支持更高精度。关键是选择合适的时间单位并做类型转换——别直接用 auto 接转换结果,否则可能丢失精度或触发隐式截断。
auto ms = std::chrono::duration_cast<:chrono::milliseconds>(now.time_since_epoch()).count();
auto ms = now.time_since_epoch().count(); —— 这里 count() 返回的是纳秒(取决于实现),不是毫秒std::chrono::duration_cast<:chrono::microseconds>(...)

system_clock 实际精度可能只有 10–15ms,别指望真达到纳秒级localtime_s / localtime_r 差异)C++20 引入了 的日历支持,但 C++11/14/17 没有。所以目前最稳妥的做法仍是用 C 风格函数,但得处理好线程安全和平台差异:
localtime_r(&t, &tm),tm 是栈上变量localtime_s(&tm, &t),参数顺序相反std::put_time(C++11 起)配合 std::localtime(不推荐多线程环境)auto now = std::chrono::system_clock::now(); std::time_t t = std::chrono::system_clock::to_time_t(now); std::cout << std::put_time(std::localtime(&t), "%Y-%m-%d %H:%M:%S");
std::chrono::steady_clock?steady_clock 是单调时钟,适合测间隔(比如性能计时),但它不对应系统时间——不能转成 time_t,也没有 to_time_t 方法。一旦你看到代码里用 steady_clock::now() 去“获取当前日期”,那基本就是逻辑错误。
std::chrono::steady_clock::to_time_t(...) → 编译失败system_clock 用于时间点(日志、时间戳),steady_clock 用于持续时间(超时、耗时统计)zoned_time 更合适,但目前主流编译器支持仍有限nanoseconds 就真能拿到纳秒,结果在 Windows 上跑出来全是 15ms 的倍数;还有人把 steady_clock 和系统时间混用,导致日志时间戳突然倒退或跳变。