最可靠方法是用 std::chrono::steady_clock 计算毫秒级时间差,因其单调且不受系统时间调整影响;需避免混用不同 clock 类型、漏掉 duration_cast 后的 .count(),以及 time_t 相关旧 api 的精度和时区问题。

用 std::chrono 计算毫秒级时间差最可靠
直接用 std::chrono::steady_clock 或 std::chrono::system_clock,别碰 time_t + difftime() 那套老方法——它只到秒级,还容易因时区/夏令时出错。
常见错误是混用不同 clock 类型做减法(比如 system_clock::now() 减 steady_clock::now()),编译不过;或者用 duration_cast 时没指定目标单位,结果截断为 0。
-
steady_clock更适合测间隔(不受系统时间调整影响),system_clock适合和真实时间对齐 - 统一用
auto start = clock::now(); auto end = clock::now();,再用end - start得到duration - 转毫秒:用
std::chrono::duration_cast<:chrono::milliseconds>(diff).count()</:chrono::milliseconds>,别漏掉.count()
计算带日期的完整时间差要用 std::tm + 手动拆解
std::chrono 不直接支持“X 年 Y 月 Z 天”这种人类可读差值,得靠 std::mktime 把两个 std::tm 转成 time_t,再用 difftime() 拿总秒数,最后自己除算年月日。
坑点在于 std::tm 的字段是零基(tm_mon 是 0–11,tm_year 是距 1900 年的偏移),填错一个就全乱;还有 mktime() 会修改输入结构体(比如把 tm_wday、tm_yday 重算),别拿它当只读数据源。
- 初始化
std::tm时显式设tm_isdst = -1,让系统自动判断夏令时 - 两次调
mktime()前,确保tm_sec到tm_year全填了,未填字段是随机值 - 总秒数差除以 86400 得天数,但“月”和“年”不能简单除,因为月份天数不固定——真要精确得用日历算法(如 Howard Hinnant 的 date 库)
跨平台高精度计时避免 Windows 上的 QueryPerformanceCounter 陷阱
Windows 下有人直接用 QueryPerformanceCounter + QueryPerformanceFrequency,但要注意:某些旧虚拟机或电源管理策略会让频率漂移,导致时间差计算变大或变小;而且它不保证单调性(极少数情况计数器倒退)。
std::chrono::steady_clock 在现代 MSVC 和 MinGW 中底层就是封装了这个 API,但加了校验和 fallback,比手撸更稳。
- 别自己写
LARGE_INTEGER解包逻辑,除非你真需要 sub-microsecond 级别且能控制运行环境 - 如果必须用原生 API,每次调用后检查
QueryPerformanceCounter返回值是否为 0(失败),并验证频率是否 > 0 - Linux/macOS 下对应的是
clock_gettime(CLOCK_MONOTONIC, ...),std::chrono同样做了跨平台封装
输出时间差字符串时小心 std::format 的 C++20 兼容性
C++20 引入 std::format 可以格式化 duration,比如 std::format("{:%H:%M:%S}", diff),但 GCC 12、Clang 14 之前默认不启用,MSVC 2019 Update 9 才开始支持。贸然用会编译失败。
更现实的做法是手动分解:先转成总毫秒,再算小时、分钟、秒、毫秒各部分,用 std::ostringstream 拼接。
- 别用
%S直接格式化std::chrono::milliseconds——它只认std::chrono::seconds或更粗粒度类型 - 若需 ISO 8601 格式(如
P1DT3H5M20.123S),得自己实现或引入第三方库(如 date.h) - 注意负时间差:duration 支持负值,输出前最好先取绝对值再分段,否则小时/分钟可能显示为负号
实际项目里,95% 的场景用 steady_clock + duration_cast 就够了;真要按日历算“几月几天”,别硬刚标准库,直接上 date::parse 和 date::floor 更省心。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











