fmt 与 Howard Hinnant 的日期:为什么从 fmt::to_string "{}"?FMT 和日期的最佳实践?
fmt with Howard Hinnant's date: why "{}" from fmt::to_string? Best practice for fmt and date?
TL;DR:我正在为 fmt 和 Howard Hinnant 的日期库实现自定义格式化程序。有了date::year_month_day d{};
,为什么fmt::to_string(d)
返回"{}"
而fmt::format("{}", d)
工作正常,返回"0000-00-00"
?神螺栓上的例子。
我正在使用日期库并尝试从 iostreams 切换到 fmt。我需要以 YYYY-MM-DD 格式格式化date::year_month_day
,所以我编写了一个自定义格式化程序(fmt::date::year_month_day
格式化程序的模板专用化(:
template<>
struct fmt::formatter<date::year_month_day> {
template<typename ParseContext>
auto parse(ParseContext & ctx) { return ctx.begin(); }
template<typename FormatContext>
auto format(const date::year_month_day & ymd, FormatContext & ctx) -> decltype(ctx.out()) {
const int year = (int)ymd.year();
const unsigned month = (unsigned)ymd.month();
const unsigned day = (unsigned)ymd.day();
return fmt::format_to(ctx.out(), "{:04}-{:02}-{:02}", year, month, day);
}
};
完整的最小工作示例,包括两个工作示例和一个失败示例,可在 godbolt 上找到。
使用该自定义格式化程序,fmt::format("{}", date::year_month_day{})
按预期工作,返回"0000-00-00"
。fmt::to_string(date::year_month_day{})
应该返回相同的结果,但返回"{}"
。
格式化date::year_month_day
和其他类型的date
的最佳方法是什么fmt
,包括fmt::to_string()
?为什么我会得到那个"{}"
?
我还不能使用支持 C++20 日期的编译器:据我所知,截至 2020 年 6 月,C++20 的 std::chrono 还没有完整的日历和时区部分实现。
更新:对自定义空结构使用自定义格式化程序工作正常,对format("{}", s)
和to_string(s)
给出相同的结果,请参阅上面 godbolt 链接上的示例。所以date::year_month_day
一定有什么特别的东西打破了fmt::to_string()
.
这是依赖于参数的查找的不幸效果:fmt::to_string
调用format
,最终被解析为date::format
而不是fmt::format
。解决方法是完全限定对format
fmt::to_string
的调用,因为它依赖于用户定义的类型。
更新:此问题已在 https://github.com/fmtlib/fmt/commit/2cac8a9d2e36cd920a9a60ec5b776c187e843fbb 中修复。
- 查询SQLite数据库中的日期
- 用C++20 fmt限制结果的总大小
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- Log4cpp:以UTC/GMT时区打印日期
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 使用C++的日期库读取时间
- 日期格式为C++
- 如何在 C++20 计时中为日期添加天数?
- 如何在QTableView中排序和更改日期格式
- 如何在cpp中使用地图显示给定日期范围内(在下面的问题中)的费率?
- Gtkmm 会不断检查 Gtk::日历上的所选日期是否发生变化
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- fmt 与 Howard Hinnant 的日期:为什么从 fmt::to_string "{}"?FMT 和日期的最佳实践?
- 使程序检查当前日期是否=预期日期
- 如何找到两个日期之间的时间差异(以秒和纳秒为单位)?
- JNI 日期值转换问题,在C++中获取不同的长整型值
- 确定夏令时是否适用于特定日期
- C++日期库因时区而失败
- 向日期运算符添加天数+
- 如何在 cpp 中解压缩数字,如果它们是使用 struct.pack(fmt, v1, v2, ..) 打包在 pyth