使用stringstream格式化日期

时间:2014-03-03 08:58:32

标签: c++ string stringstream

我想避免在我的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";

但这只会格式化其中一个整数。我需要为每个日期和tiem组件执行此操作,然后将所有这些组合在一起。因此,要替换一行C风格代码,我需要更多新代码。

没有办法比这更好吗?

2 个答案:

答案 0 :(得分:2)

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

在没有样板文件的情况下,在C ++ 11中格式化日期/时间的另一种方法是put_time

答案 1 :(得分:2)

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

(2)为其定义operator <<()operator >>()。在这些功能中,使用std::time_putstd::time_get构面来实现。

(3)如果std::time_putstd::time_get无法满足您的需求,您可以通过继承它们来定义自己的time_put / get facet,并在必要时使用其他助手方面,例如date_time格式管理器

PS:如果您使用的是c ++ 11,则可能会满足std::time_put::put()std::time_get::get()

祝你好运!