c++ fmt格式%H:%M:%S,无小数

o8x7eapl  于 2023-11-19  发布在  其他
关注(0)|答案(2)|浏览(158)

我正在尝试将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


我想把它舍入到最接近的整数,但不知道在哪里放置精度说明符(精度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


我有点迷失在盯着时间的格式规格的细节.
上面的编译器资源管理器示例是here

rjzwgtxy

rjzwgtxy1#

要四舍五入到最接近的秒,请使用round<seconds>(tp)将时间点转换为秒精度。此外,high_resolution_clock与日历没有可移植关系。您需要使用system_clock。对于gcc,high_resolution_clocksystem_clock的类型别名,因此它意外地工作。但这将无法使用MSVC或LLVM工具编译。

#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);
}

字符串
Demo.
如果你想要其他舍入模式,你也可以使用floorceil

y3bcpkx1

y3bcpkx12#

我不知道这转换成<fmt>的效果如何,但对于标准C++ <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

相关问题