最可靠方式是统一转为 std::chrono::milliseconds 再用 duration_cast 提取总秒数,对60取余得秒、除60得分;负值需手动判断符号并取绝对值,避免依赖编译器的负数取余行为。

用 std::chrono 提取毫秒数的分和秒部分最可靠
直接对毫秒数做整除和取余是最简单、零依赖的方式,但要注意输入是否为负值或超出 int 范围。推荐统一转成 std::chrono::milliseconds 再转换,能自动处理溢出、符号和单位一致性问题。
实操建议:
- 先用
std::chrono::duration_cast<:chrono::seconds></:chrono::seconds>提取总秒数,再对 60 取余得秒;总秒数再除以 60 得分 - 毫秒部分(0–999)不显示在“分:秒”里,若需带毫秒可额外提取
ms.count() % 1000 - 负毫秒数会得到负分负秒,如需始终显示正向格式(如 "-1:30" → "−1:30"),需手动判断符号并取绝对值运算
手写整除逻辑时必须检查边界和符号
很多代码直接写 minutes = ms / 60000、seconds = (ms % 60000) / 1000,看似简洁,但 C++ 中负数取余结果依赖编译器实现(C++11 后规定向零截断,但易被忽略)。
常见错误现象:
-
-65000毫秒期望输出"-1:05",但-65000 % 60000是-5000,导致seconds算出-5 - 用
unsigned int存毫秒却传入负值,引发回绕(如4294902296秒)
安全写法示例:
int ms = -65000; bool negative = ms <h3>格式化输出时避免 <code>sprintf</code> 和 <code>std::to_string</code> 拼接</h3><p>用 <code>std::format</code>(C++20)最干净,但若项目未启用 C++20,<code>std::ostringstream</code> 比字符串拼接更可控,尤其处理个位数补零。</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill2659" title="C++"><img src="https://img.php.cn/upload/skill/000/000/081/178927213426672.jpg" alt="C++" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill2659" title="C++" class="overflowclass">C++</a> <p class="overflowclass">"空空如也"</p> </div> <a rel="nofollow" href="/xiazai/skill2659" title="C++" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div><p>使用场景:</p>
- 需要固定两位宽(如
"05:09"而非"5:9") - 嵌入日志或 UI 字符串,要求无内存泄漏、无可变参数风险
推荐写法(C++11+):
#include <sstream> #include <iomanip><p>std::ostringstream oss; oss </p></iomanip></sstream>
注意 time_t 或 std::system_clock::time_point 的转换陷阱
如果原始数据来自时间点差值(如 end_time - start_time),别直接强转为 long long 毫秒——不同平台下 duration::rep 类型可能为 int64_t 或 long,且精度未必是毫秒。
正确做法:
- 统一用
auto duration = end_time - start_time,再duration_cast<milliseconds></milliseconds> - 避免
time_t直接减:它只保证秒级精度,毫秒信息已丢失 - Windows 下
GetTickCount64()返回的是毫秒,但 Linux 的clock_gettime(CLOCK_MONOTONIC, ...)需自己换算到毫秒
容易被忽略的地方是:你以为传进来的“毫秒数”真的是毫秒,但它可能是微秒、纳秒,或者已经经过一次错误缩放。务必确认源头单位。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










