c++将time_t转换为字符串并返回

z5btuh9x  于 2023-06-07  发布在  其他
关注(0)|答案(5)|浏览(432)

我想把time_t转换成字符串,然后再转换回来。
我想使用ctime()将时间转换为字符串。
我似乎找不到任何在谷歌或time.h头文件,任何想法?
基本上,我尝试做的是将日期存储在文件中,然后将其读回,以便我可以再次将其用作time_t。

此外,没有std、mfc以外的库引用。

还有一点要注意,这将必须在Windows xp及以上版本上运行,仅此而已。

编辑

我所要做的就是将time_t转换为字符串(我不在乎它是否是人类可读的),然后将其转换回time_t。我基本上只是试图将time_t存储到一个文件中并再次读取它(但我不需要任何代码,因为除了time_t之外,文件中还有更多信息)。

flvlnr44

flvlnr441#

你必须自己写一个函数来实现这一点。这些函数将任何原始类型(或重载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;
}
jm81lzqq

jm81lzqq2#

time_t Wikipedia article文章对此进行了一些阐述。底线是time_t的类型在C规范中没有保证。下面是一个你可以尝试的例子:
试试stringstream

#include <string>
#include <sstream>

time_t seconds;
time(&seconds);

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

上述技术的一个很好的 Package 器是Boost的lexical_cast:

#include <boost/lexical_cast.hpp>
#include <string>

time_t t;
time(&t);

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

时间t上的维基百科:
time_t数据类型是ISO C库中为存储系统时间值而定义的数据类型。这些值是从标准time()库函数返回的。此类型是标准头中定义的typedef。ISO C将time_t定义为算术类型,但未指定任何特定类型、范围、分辨率或编码。同样未指定的是应用于时间值的算术运算的含义。

Unix和POSIX兼容系统将time_t类型实现为signed integer(通常为32或64位宽),表示自Unix纪元开始以来的秒数:UTC 1970年1月1日午夜(不包括闰秒)。有些系统可以正确处理负时间值,而有些则不能。使用32位time_t类型的系统易受Year 2038 problem影响。

j1dl9f46

j1dl9f463#

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

mftmpeh8

mftmpeh84#

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

62lalag4

62lalag45#

另一个带有stringstream的答案会给予你一个不可读的整数(如问题中所要求的)。
如果你喜欢一个可读的答案,这里是:

#include <ctime>
#include <string>
time_t timeAsTimeT = /** init your time here **/ ;
std::string myStr = std::asctime(std::localtime(&timeAsTimeT);

相关问题