提问人:Michael A 提问时间:11/11/2023 最后编辑:John KugelmanMichael A 更新时间:11/11/2023 访问量:302
fmt 格式 %H:%M:%S,不带小数
fmt format %H:%M:%S without decimals
问:
我正在尝试将对象格式化为 HH:MM::SS 格式,例如 16:42:02 是小时 (16)、分钟 (42) 和秒 (2)。std::chrono::duration
该库为此提供了有用的格式说明符: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
我想将其四舍五入到最接近的整数,但无法弄清楚将精度说明符放置在哪里(精度 2 仅是测试):
fmt::print("{:.2%H:%M:%S} \n", end); // error
fmt::print("{:.2f%H:%M:%S} \n", end); // error
fmt::print("{:%H:%M:.2%S} \n", end); // nonsense: 17:07:.202.454873454
盯着 chrono 格式规范的细节,我有点迷茫......
此处是上述编译器资源管理器示例。
答:
13赞
Howard Hinnant
11/11/2023
#1
要四舍五入到最接近的秒数,请使用 将时间点转换为秒精度。此外,与日历没有可移植关系。您需要改用。对于 gcc,是 的类型别名,因此它是偶然工作的。但是,使用 MSVC 或 LLVM 工具进行编译将无法进行编译。round<seconds>(tp)
high_resolution_clock
system_clock
high_resolution_clock
system_clock
#include <fmt/chrono.h>
#include <fmt/format.h>
#include <chrono>
#include <iostream>
#include <thread>
#include <vector>
int main() {
using namespace std::chrono;
auto start = round<seconds>(system_clock::now());
auto end = start + 4s;
fmt::print("{:%H:%M:%S} \n", end);
}
如果您想要其他舍入模式,也可以使用或。floor
ceil
0赞
Toby Speight
11/11/2023
#2
我不知道这转换为什么程度,但对于标准 C++ ,您可以使用说明符获得整秒作为区域设置的替代表示。<fmt>
<format>
%OS
或者我们可以使用语言环境对整个时间的表示,使用 或 .%X
%EX
当然,这适用于我的 Debian 系统(请注意,我们将“C”语言环境传递给):format()
#include <chrono>
#include <format>
#include <iostream>
#include <locale>
int main()
{
using clock = std::chrono::system_clock;
std::cout << std::format(std::locale::classic(), "{:%X} \n", clock::now());
}
产生(例如):
16:42:02
评论