You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取可重复使用的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;
}

方案说明

  1. 合法性:标准库允许直接实例化std::formatter特化对象,文档中提到的“通常不直接访问”只是普通场景下直接用std::format更简洁的建议,并非禁止直接使用formatter。
  2. 性能优势:格式字符串的解析仅在构造时执行一次,避免了每次调用std::format时重复解析的开销,适合频繁格式化同一格式的场景。
  3. 通用性:该方案适用于所有标准库提供std::formatter特化的类型(包括chrono时间类型、基本数据类型等),只要类型的formatter特化支持parse和重复调用format即可。

内容的提问来源于stack exchange,提问作者wilx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:57:08