使用 fmtlib 格式化 ISO 时间

Formatting ISO time using fmtlib

我正在尝试使用 fmtlib 获得 std::string 的 ISO 时间。 考虑以下代码:

const auto t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
const auto creation_time = fmt::format("{:%FT%T%z}", fmt::localtime(t));

我收到以下错误:

../deps/fmt-src/include/fmt/chrono.h: In function 'size_t fmt::v7::detail::strftime(char*, size_t, const char*, const tm*)': ../deps/fmt-src/include/fmt/chrono.h:377:48: error: format not a string literal, format string not checked [-Werror=format-nonliteral] return std::strftime(str, count, format, time);

我不明白,因为很明显 fmt::localtime(t) 不是编译时字符串。

我错过了什么?

使用 fmtlib v7.1.3,使用以下标志编译以在嵌入式系统上工作:

target_compile_definitions(fmt PRIVATE FMT_STATIC_THOUSANDS_SEPARATOR FMT_USE_DOUBLE=0 FMT_USE_LONG_DOUBLE=0)

问题是您正在使用 -Werror=format-nonliteral 编译器标志进行编译,而计时格式化程序使用动态格式字符串调用 strftime。解决方案是删除 -Werror=format-nonliteral 或添加 -Wno-error=format-nonliteral.

或者您可以使用 {fmt} 5a37e1 或更高版本来抑制此警告。