如何用fmt库格式化std::chrono::duration为无小数的HH:MM:SS格式
格式化std::chrono::duration为HH:MM:SS整数秒格式
我尝试将std::chrono::duration对象格式化为HH:MM:SS格式(例如16:42:02,其中16为小时、42为分钟、2为秒)。用fmt库的格式化说明符写了如下代码:
using namespace std::chrono; auto start = high_resolution_clock::now(); auto end = start + 4s; fmt::print("{:%H:%M:%S} \n", end);
但输出的秒数带有小数:
16:58:55.359425076
我想把秒数四舍五入为整数,试了几种精度写法都不对:
fmt::print("{:.2%H:%M:%S} \n", end); // 报错 fmt::print("{:.2f%H:%M:%S} \n", end); // 报错 fmt::print("{:%H:%M:.2%S} \n", end); // 输出无意义内容:17:07:.202.454873454
解决方案
要实现秒数四舍五入为整数的HH:MM:SS格式,有两种可行方式:
方式一:直接指定精度说明符
fmt库中,chrono格式化的精度需要放在格式说明符的最前端,作用于整个时间点的秒部分。如果要保留整数秒,使用.0精度即可:
fmt::print("{:.0%H:%M:%S} \n", end);
也可以用等价的%T格式说明符(%T对应%H:%M:%S):
fmt::print("{:.0%T} \n", end);
这样会自动将秒数四舍五入为整数,输出类似16:58:55的结果。
方式二:转换为整秒时间点
先将时间点转换为std::chrono::seconds类型,再进行格式化,这样得到的秒数天然是整数:
auto end_sec = time_point_cast<seconds>(end); fmt::print("{:%H:%M:%S} \n", end_sec);
内容的提问来源于stack exchange,提问作者Michael A
相关产品推荐
相关产品推荐

