fmt 格式 %H:%M:%S,不带小数

fmt format %H:%M:%S without decimals

提问人:Michael A 提问时间:11/11/2023 最后编辑:John KugelmanMichael A 更新时间:11/11/2023 访问量:302

问:

我正在尝试将对象格式化为 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 格式规范的细节,我有点迷茫......

此处是上述编译器资源管理器示例。

C 格式化 ++20 C ++-Chrono FMT

评论


答:

13赞 Howard Hinnant 11/11/2023 #1

要四舍五入到最接近的秒数,请使用 将时间点转换为秒精度。此外,与日历没有可移植关系。您需要改用。对于 gcc,是 的类型别名,因此它是偶然工作的。但是,使用 MSVC 或 LLVM 工具进行编译将无法进行编译。round<seconds>(tp)high_resolution_clocksystem_clockhigh_resolution_clocksystem_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);
}

演示。

如果您想要其他舍入模式,也可以使用或。floorceil

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