chrono使用场景举例
1 输出格式化字符串
示例代码
auto now = std::chrono::system_clock::now();
auto t = std::chrono::system_clock::to_time_t(now);
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;
std::ostringstream oss;
oss << std::put_time(std::localtime(&t), "%F %T")
<< "." << std::setw(3) << std::setfill('0') << ms.count();
这段代码使用C++11的<chrono>
库获取当前时间并生成带毫秒的时间戳字符串。
- 获取当前时间点
auto now = std::chrono::system_clock::now();
system_clock::now()
: 获取当前系统时间点(UTC时间)- 返回类型:
std::chrono::system_clock::time_point
- 转换为C风格时间
auto t = std::chrono::system_clock::to_time_t(now);
to_time_t()
: 将time_point
转换为time_t
(自1970-01-01起经过的秒数)- 用于后续调用传统C时间函数
- 提取毫秒部分
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
now.time_since_epoch()
) % 1000;
time_since_epoch()
: 获取从时钟纪元到now
的时间间隔duration_cast<milliseconds>
: 将时间间隔转换为毫秒精度% 1000
: 取模运算获取当前秒内的毫秒数(0-999)
- 格式化输出
oss << std::put_time(std::localtime(&t), "%F %T")
<< "." << std::setw(3) << std::setfill('0') << ms.count();
localtime(&t)
: 将time_t
转换为本地时间的tm
结构put_time(..., "%F %T")
: 格式化为YYYY-MM-DD HH:MM:SS
%F
等价于%Y-%m-%d
%T
等价于%H:%M:%S
ms.count()
: 获取毫秒数值(整数)setw(3)
+setfill('0')
: 确保毫秒固定3位(如5→"005")
最终输出格式
YYYY-MM-DD HH:MM:SS.sss
示例:2023-10-05 14:30:45.123
注意事项
线程安全性:
std::localtime
不是线程安全的(使用静态缓冲区)。多线程环境下应改用:std::tm tm_buf; localtime_r(&t, &tm_buf); // POSIX // 或 localtime_s(&tm_buf, &t); // Windows
C++20替代方案:
C++20的<chrono>
库提供更简洁的时间格式化:auto now = std::chrono::system_clock::now(); return std::format("{:%Y-%m-%d %H:%M:%S}", now);
精度控制:
当前代码精确到毫秒,如需微秒/纳秒:// 微秒示例 auto us = std::chrono::duration_cast<std::chrono::microseconds>( now.time_since_epoch() ) % 1000000;