C++ std::chrono高精度时间对比及epoch计数转time_t与格式化输出问题
高精度时间操作问题解答
1. 毫秒/微秒级时间对比实现
直接使用std::chrono库的时间点差值计算即可实现高精度耗时统计,完全不需要依赖秒级的time_t类型:
- 任务计时优先选择
std::chrono::steady_clock,不受系统时间跳变、NTP同步等干扰,计时结果更准确 - 差值计算后可通过
duration_cast指定任意精度(纳秒、微秒、毫秒均可)
示例代码:
#include <chrono> #include <iostream> int main() { auto start = std::chrono::steady_clock::now(); // 执行你的任务逻辑 // ... auto end = std::chrono::steady_clock::now(); // 输出微秒级耗时 auto cost_us = std::chrono::duration_cast<std::chrono::microseconds>(end - start); std::cout << "任务耗时:" << cost_us.count() << " 微秒\n"; // 输出毫秒级耗时 auto cost_ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); std::cout << "任务耗时:" << cost_ms.count() << " 毫秒\n"; return 0; }
如果需要输出带高精度的可读时间格式,C++20及以上版本可直接使用std::format("{:%F %T}", tp)直接输出带微秒的时间,低版本可手动拆分秒以下部分拼接输出。
2. uint64_t纪元计数转换为可读时间
std::chrono::system_clock::now().time_since_epoch().count()返回的是时钟原生精度的计数,转换时需要先还原为duration类型再进一步处理:
#include <chrono> #include <iostream> #include <ctime> int main() { // 你获取的uint64_t时间计数 uint64_t current1 = std::chrono::system_clock::now().time_since_epoch().count(); // 转换为system_clock的时间点 auto tp = std::chrono::system_clock::time_point(std::chrono::system_clock::duration(current1)); // 提取秒级部分转time_t用于格式化输出 std::time_t t = std::chrono::system_clock::to_time_t(tp); // 提取微秒级后缀 auto us = std::chrono::duration_cast<std::chrono::microseconds>(tp.time_since_epoch()) % 1000000; // 拼接输出完整时间 std::cout << "当前时间:" << std::ctime(&t) << " 微秒:" << us.count() << "\n"; return 0; }
注意事项
- 如果你拿到的uint64_t计数本身是明确指定单位的(比如明确是微秒级纪元偏移),可以直接用
std::chrono::microseconds(current1)构造duration,再转time_point即可,不需要适配system_clock的原生精度 - 不要直接对count返回的uint64_t做除法取整拆分时间,不同平台system_clock的原生精度可能不同(部分平台是100纳秒、部分是纳秒),直接运算会有兼容性问题
内容的提问来源于stack exchange,提问作者learnzz
相关产品推荐
相关产品推荐

