c ++将time_t格式化为std :: string:buffer length的函数?

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这样的缓冲区长度.但我猜你不能动态设置缓冲区长度?也许我可以挑选一个任意大的缓冲区?我有点担心如何使它成为通用的.

如何编写一个函数来实现这一目标?

Moo*_*uck 5

如果你有 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 结果的内容。


Ale*_*kov 5

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)


Rob*_*edy 3

使用 avector<char>作为缓冲区而不是数组。重复增加大小直到strftime返回非零。