如何将std::chrono::high_resolution_clock::now()转换为毫秒、微秒及生成时间戳?
解决
std::chrono::high_resolution_clock::now()生成时间戳的问题 嘿,我刚踩过一模一样的坑!直接打印high_resolution_clock::now()返回的time_point对象肯定会报错——因为C++标准库的ostream根本没默认支持输出这个类型,它不是int或者double这种基础数据类型,编译器完全不知道该怎么处理它的输出逻辑。
下面分两种常用场景给你解决方案:
一、生成通用Unix时间戳(从1970-01-01 UTC开始的毫秒/秒数)
这是最常用的时间戳场景,但要注意:high_resolution_clock的起始时间(epoch)不一定是Unix epoch(比如Windows上它的起始点是系统启动时间,而非UTC时间),所以得先把它转换为system_clock的时间点,再计算和Unix epoch的时间间隔。
直接上可运行的代码:
#include <chrono> #include <iostream> int main() { // 获取当前高分辨率时间点 auto t0 = std::chrono::high_resolution_clock::now(); // 把高分辨率时钟的时间点转换为系统时钟(对应UTC时间)的时间点 // 这个转换逻辑是对齐两个时钟的当前时刻,避免时钟偏移 auto system_time_point = std::chrono::time_point_cast<std::chrono::system_clock::duration>( t0 - std::chrono::high_resolution_clock::now() + std::chrono::system_clock::now() ); // 生成毫秒级Unix时间戳 long long ms_timestamp = std::chrono::duration_cast<std::chrono::milliseconds>( system_time_point.time_since_epoch() ).count(); std::cout << "毫秒级Unix时间戳:" << ms_timestamp << "\n"; // 生成浮点秒级Unix时间戳(支持精确到小数点后多位) double sec_timestamp = std::chrono::duration<double>( system_time_point.time_since_epoch() ).count(); std::cout << "浮点秒级Unix时间戳:" << sec_timestamp << "\n"; return 0; }
二、调试用:打印高分辨率时钟的原始计时值
如果你只是想看看high_resolution_clock内部的计时数值(比如调试性能时看相对时间间隔),可以直接输出它自自身epoch以来的时长计数:
#include <chrono> #include <iostream> int main() { auto t0 = std::chrono::high_resolution_clock::now(); // 输出自高分辨率时钟起始点以来的纳秒数(精度取决于你的平台) auto ns_count = std::chrono::duration_cast<std::chrono::nanoseconds>(t0.time_since_epoch()).count(); std::cout << "高分辨率时钟自起始点以来的纳秒数:" << ns_count << "\n"; return 0; }
注意:这个值的起始点是平台相关的,不能用来和其他机器的时间做对比,仅适合本地的相对计时场景。
补充小提示
- Linux平台上
high_resolution_clock和system_clock是同一个实现,转换步骤可以简化,但为了跨平台兼容性,保留转换逻辑会更稳妥。 - 如果只需要做相对计时(比如计算代码片段的运行耗时),直接用两个
high_resolution_clock的time_point相减得到duration即可,不需要转换到system_clock。
内容的提问来源于stack exchange,提问作者Evandro Coan
相关产品推荐
相关产品推荐

