在c++20中格式化秒(使用std::format)而不显示小数位的正确方法是什么?
此代码:
#include <chrono>
#include <format>
#include <iostream>
int main()
{
std::cout << std::format("{:%H:%M:%S}", std::chrono::system_clock::now()) << std::endl;
std::cout << std::format("{:%H:%M:%OS}", std::chrono::system_clock::now()) << std::endl;
}
产生此输出(经由干线GCC(14.0.0 20230425)):
00:18:07.087240403
00:18:07.087622600
我只想要整数部分(例如00:18:07
没有尾随.087240403
)。事后从结果字符串中删除余数非常容易(或者手动提取秒数并单独打印),但如果这是预期的解决方案,我会非常惊讶。
此处描述了格式代码。AFAICT没有%S
变量将秒显式舍入或截断为最接近的整数。
%S(和下面的%OS)的解释(来自上面的链接)是:
将秒写入十进制数。如果秒数小于10,则结果以0为前缀。
如果输入的精度不能精确地用秒表示,则格式为具有固定格式和与输入精度匹配的精度的十进制浮点数(或者,如果在18个小数位内无法转换为浮点十进制秒,则转换为微秒精度)。小数点字符根据区域设置进行本地化。
修改后的命令%OS写入区域设置的替代表示。
GCC/glibc在这里运行正常,对吗?(这似乎符合上面的解释)。
如果是这样的话,实现这一目标的“预期”方法是什么?
1.我是否使用不同的格式字符串?
1.我是否使用不同的时钟?
1.我是否首先手动舍入该值?(如果四舍五入,仍显示小数部分)。
1.或者我真的必须手动剥离小数部分或手动提取秒。
(* 如果 * 这不是 * 平凡 * 可实现的,这是否可以被认为是潜在的不良行为,也许是STL缺陷?)
1条答案
按热度按时间cngwdvgl1#
您可以使用
time_point_cast
将其持续时间转换为seconds
,然后对其进行格式化: