【问题标题】:Formatting dates with stringstream使用字符串流格式化日期
【发布时间】:2014-03-03 08:58:32
【问题描述】:

我想避免在我的 C++ 代码中使用 sprintf,因此我只能使用 C++ 中的 std 字符串,但我还没有找到替换它的方法。我目前使用 sprintf 来格式化日期和时间,如下所示:

char myDate[DATE_LENGTH]{};
sprintf(myDate, "%4d-%02d-%02d %02d:%02d:%02d", year, month, day,
        hour, minute, second);

通过这种方式,我将获得每个整数的固定长度,如果需要,前导零。

我已经搜索了如何用 stringstream 替换它,发现了这个:

std::ostringstream ss;
ss << std::setw(5) << std::setfill('0') << 12 << "\n";

但这只会格式化其中一个整数。我需要为每个 date 和 tiem 组件执行此操作,然后将它们全部附加在一起。所以要替换一行 C 风格的代码,我需要更多的新代码。

没有比这更好的方法了吗?

【问题讨论】:

    标签: c++ string stringstream


    【解决方案1】:

    (1) 定义您自己的数据时间类。

    (2) 为它定义operator &lt;&lt;()operator &gt;&gt;()。在这些函数中,使用std::time_putstd::time_get facet来实现。

    (3) 如果std::time_putstd::time_get不能满足你的需求,你可以通过继承他们定义你自己的time_put/get facet,如果需要的话还可以定义其他的辅助facet比如date_time格式管理器。

    PS:如果你使用的是 c++11,std::time_put::put()std::time_get::get() 可能会满意。

    祝你好运!

    【讨论】:

      【解决方案2】:

      在 C++ 应用程序中使用snprintf()strftime() 没什么不好的。它们快速、可靠,并且是标准库的一部分。 IOStream 有时过于冗长而无法直接使用它们。您始终可以将基于 sprintf 的序列化程序包装到 iostream shell 中。

      另一种在 C++11 中格式化日期/时间而无需样板的方法是通过 put_time

      【讨论】:

        猜你喜欢
        • 2012-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多