如何获取可重复使用的std::formatter<std::chrono::zoned_time>实例?
无需hack实现重复使用时间格式化器
完全可以通过标准合法的方式实现,不需要任何hack手段。核心思路是直接实例化并复用std::formatter特化对象,在初始化时完成格式字符串的解析,后续即可重复调用其格式化能力。
具体实现方案
封装一个可复用的格式化类,在构造阶段完成格式字符串的解析,之后通过类的方法重复格式化时间:
#include <chrono> #include <format> #include <string> #include <iostream> template <typename TimePoint> class ReusableTimeFormatter { public: // 构造时解析格式字符串,完成formatter初始化 explicit ReusableTimeFormatter(std::string_view format_str) { fmt_.parse(format_str); } // 重复调用格式化方法 std::string format(const TimePoint& time_point) const { std::string result; std::format_to(std::back_inserter(result), fmt_, time_point); return result; } private: std::formatter<TimePoint> fmt_; }; // 使用示例 int main() { // 创建绑定了指定格式的格式化器实例 auto date_formatter = ReusableTimeFormatter<std::chrono::system_clock::time_point>("%Y-%m-%d %H:%M:%S"); auto now = std::chrono::system_clock::now(); std::cout << date_formatter.format(now) << "\n"; // 后续无需重新解析格式,直接复用 std::cout << date_formatter.format(std::chrono::system_clock::now()) << "\n"; return 0; }
方案说明
- 合法性:标准库允许直接实例化
std::formatter特化对象,文档中提到的“通常不直接访问”只是普通场景下直接用std::format更简洁的建议,并非禁止直接使用formatter。 - 性能优势:格式字符串的解析仅在构造时执行一次,避免了每次调用
std::format时重复解析的开销,适合频繁格式化同一格式的场景。 - 通用性:该方案适用于所有标准库提供
std::formatter特化的类型(包括chrono时间类型、基本数据类型等),只要类型的formatter特化支持parse和重复调用format即可。
内容的提问来源于stack exchange,提问作者wilx
相关产品推荐
相关产品推荐

