【C/C++】chrono简单使用场景 - 教程
2025-10-07 14:16 tlnshuju 阅读(13) 评论(0) 收藏 举报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 ;