2014-03-03 52 views
1

我想避免在我的C++代码中使用sprintf,因此我只能使用C++中的std字符串,但是我还没有找到替换它的方式。我现在用sprintf格式化日期和时间是这样的:使用stringstream格式化日期

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"; 

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

难道没有办法做得比这更好吗?

回答

2

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

(2)为其定义operator <<()operator >>()。在这些功能中,使用std::time_putstd::time_get构面来实现。 (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()时出现问题。它们速度快,可靠,它们是标准库的一部分。有时IOStreams过于冗长,无法直接使用它们。您始终可以将基于sprintf的串行器合并到iostream shell中。

通过put_time,在C++ 11中格式化日期/时间的另一种方法是使用put_time