C ++将time_t转换为字符串,然后再转回去

10
我想把 time_t 转换成字符串,然后再转回 time_t。 我想使用 ctime() 将时间转换为字符串。 在谷歌或者 time.h 头文件中没有找到相关信息,有什么建议吗? 基本上,我想将一个日期存储到一个文件中,然后读取它以便我可以再次使用它作为 time_t 。 还有一点,不能使用除 std、mfc 之外的任何库。 另外,请注意,这将在 Windows xp 及以上版本上运行。
编辑: 我只想把 time_t 转换成字符串(不需要可读性),然后再把它转回 time_t。我基本上只是想将 time_t 存储到文件中并再次读取它(但我不需要任何与此相关的代码,因为文件中会有更多信息)。

您需要一个可读性强的字符串,例如“2011-08-18 21:07:10”吗? - Maxim Egorushkin
我很惊讶这里没有任何一个答案得到了0分,它们都是好的回答。 - Kelly Elton
5个回答

17

您需要编写自己的函数来完成此操作。这些函数将任何原始类型(或重载operator<<和/或operator>>的任何类型)转换为字符串,反之亦然:

template<typename T>
std::string StringUtils::toString(const T &t) {
    std::ostringstream oss;
    oss << t;
    return oss.str();
}

template<typename T>
T StringUtils::fromString( const std::string& s ) {
    std::istringstream stream( s );
    T t;
    stream >> t;
    return t;
}

1
我的初始回答只有第一句话,我认为那些负评是在我添加代码之前发生的。 - dario_ramos
啊好的。这个包括我上面发布的那个编辑吗? - Kelly Elton
1
@kelton52:是的。如果你需要写入二进制文件,你可以使用生成的字符串和 .c_str()。 - dario_ramos
谢谢你的回答,它非常有效。我不得不将wchar_t转换为char,但这就是在别人的项目上工作的结果:p。无论如何,这很简单并且非常有效。 - Kelly Elton

3
time_t维基百科文章对此有所涉及。最重要的是,C规范中并不保证time_t类型的准确性。以下是一个示例,您可以尝试使用stringstream
#include <string>
#include <sstream>

time_t seconds;
time(&seconds);

std::stringstream ss;
ss << seconds;
std::string ts = ss.str();

Boost库中提供的lexical_cast是一个很好的包装器,它可以轻松实现上述技术:
#include <boost/lexical_cast.hpp>
#include <string>

time_t t;
time(&t);

std::string ts = boost::lexical_cast<std::string>(seconds);

关于time_t的维基百科:

time_t 是 ISO C 库中定义的一种数据类型,用于存储系统时间值。这些值是从标准的 time() 库函数返回的。该类型是在标准头文件中定义的一个 typedef。 ISO C将 time_t 定义为一种算术类型,但没有指定任何特定类型、范围、分辨率或编码方式,对于应用于时间值的算术运算的含义也未作规定。

Unix 和 POSIX 兼容的系统将 time_t 类型实现为一个带符号整数(通常是 32 或 64 位宽度),表示自 Unix 纪元开始以来的秒数:1970 年 1 月 1 日 UTC 午夜(不包括闰秒)。一些系统正确处理负时间值,而另一些则不会。使用 32 位 time_t 类型的系统会受到2038年问题的影响。


请阅读我的帖子。问题不在于将其转换为字符串,而是将其转换回来,在这方面我找不到任何信息。 - Kelly Elton
@kelton:将整数转换为字符串非常简单。您需要详细说明您的要求。 - user195488
好的,我只需要把time_t类型转换成任何一种字符串,然后再转回去就可以了。我并不在乎它是否易读,我只想把它存储在一个文件中。 - Kelly Elton
@kelton:然后使用atoi()std::string time.c_str()转换回来。 - user195488

3

ctime() 返回一个使用特定格式的字符缓冲区指针。你可以使用 sprintf() 将这样的字符串解析为其各个部分并将它们存储在一个struct tm中,然后使用mktime()将其转换为time_t


2
使用gmtime()将time_t转换为struct tm,然后使用strftime()将struct tm转换为纯文本(最好是ISO 8601格式)。结果将是便携式、人类可读和机器可读的。
要返回到time_t,只需将字符串解析回struct tm并使用mktime()即可。

1
另一个使用stringstream的答案将给你一个不可读的整数(如问题所要求)。
如果你更喜欢一个可读的答案,这里就是:
#include <ctime>
#include <string>
time_t timeAsTimeT = /** init your time here **/ ;
std::string myStr = std::asctime(std::localtime(&timeAsTimeT);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接