我应该如何使用C将time_t时间戳存储到文件中?

时间:2010-11-06 16:29:39

标签: c file datetime file-io time

对于我正在编写的小型todo程序,我有这种形式的时间戳

time_t t = time(NULL);

并在每次输入任务时保存,以表示输入任务的时间。

我想将任务存储到纯文本文件中,以便可以保存和恢复状态。我应该如何将时间戳存储到文本文件中,以及在阅读文本文件后如何将它们恢复到我的程序中?

3 个答案:

答案 0 :(得分:12)

使用time_tstruct tm转换为gmtime(),然后使用struct tmstrftime()转换为纯文本(最好是ISO 8601格式)。结果将是可移植的,人类可读的和机器可读的。

要返回time_t,您只需将字符串解析为struct tm并使用mktime()

供参考:

代码示例:

// Converting from time_t to string
time_t t = time(NULL);
struct tm *ptm = gmtime(&t);
char buf[256];
strftime(buf, sizeof buf, "%F %T", ptm);
// buf is now "2015-05-15 22:55:13"

// Converting from string to time_t
char *buf = "2015-05-15 22:55:13";
struct tm tm;
strptime(buf, "%F %T", &tm);
time_t t = mktime(&tm);

答案 1 :(得分:3)

便携式方式正在使用difftime功能。使用time_t计算所选时期的mktime,然后使用difftime计算以秒为单位的差异。要转换回来,您可以将纪元作为struct tm开始,并将秒数添加到tm_sec,然后拨打mktime以获得time_t

理智方式是假设time_t表示为自Unix纪元(1970-01-01 00:00 GMT)以来的秒数并转换为大整数类型({{ 1}}最好打印它。 POSIX要求long long从纪元开始是秒,并且在任何理智的系统上都是。

答案 2 :(得分:1)

如果您不介意一些不可移植的假设,只需将time_t强制转换为longlong long,如果您有C99编译器),请写入long值,读取值并转回time_t

标准不保证time_t甚至可以表示为长:它只表示time_t是算术类型,但上面的技巧应适用于所有理智的系统: - )