Use*_*ser 6 c++ time buffer strftime stdstring
我想要一个函数,它将采用time_t参数和任意格式字符串并对其进行格式化.我想要这样的东西:
std::string GetTimeAsString(std::string formatString, time_t theTime)
{
struct tm *timeinfo;
timeinfo = localtime( &theTime);
char buffer[100];
strftime(buffer, 100, formatString.c_str(), timeinfo);
std::string result(buffer);
return result;
}
Run Code Online (Sandbox Code Playgroud)
但是我遇到的一个问题是缓冲区长度.我想做一些像formatString*4这样的缓冲区长度.但我猜你不能动态设置缓冲区长度?也许我可以挑选一个任意大的缓冲区?我有点担心如何使它成为通用的.
如何编写一个函数来实现这一目标?
如果你有 C++11:
std::string GetTimeAsString(std::string formatString, time_t theTime)
{
struct tm *timeinfo;
timeinfo = localtime( &theTime);
formatString += '\a'; //force at least one character in the result
std::string buffer;
buffer.resize(formatstring.size());
int len = strftime(&buffer[0], buffer.size(), formatString.c_str(), timeinfo);
while (len == 0) {
buffer.resize(buffer.size()*2);
len = strftime(&buffer[0], buffer.size(), formatString.c_str(), timeinfo);
}
buffer.resize(len-1); //remove that trailing '\a'
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
注意我将 formatString 作为常量引用(为了速度和安全),并使用结果字符串作为缓冲区,这比稍后进行额外复制要快。我也从与格式字符串相同的大小开始,并在每次尝试时将大小加倍,但这很容易更改为更适合 strftime 结果的内容。
C++11 解决方案std::put_time():
std::string GetTimeAsString(std::string formatString, time_t theTime)
{
const struct tm* timeinfo = localtime(&theTime);
std::ostringstream os;
os << std::put_time(timeinfo, formatString.c_str());
return os.str();
}
Run Code Online (Sandbox Code Playgroud)