使用字符串流设置日期格式

Formatting dates with stringstream

本文关键字:日期 格式 设置 字符串      更新时间:2023-10-16

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

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

这样,我将为每个整数获得一个固定的长度,如果需要,可以使用前导零。

我已经搜索了如何用字符串流替换它,并找到了这个:

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

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

难道没有比这更好的方法吗?

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

(2)定义operator <<()operator >>()。在这些函数中,使用std::time_putstd::time_get方面来实现。

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

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

祝你好运!

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

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