对于我正在编写的小型todo程序,我有这种形式的时间戳
time_t t = time(NULL);
并在每次输入任务时保存,以表示输入任务的时间。
我想将任务存储到纯文本文件中,以便可以保存和恢复状态。我应该如何将时间戳存储到文本文件中,以及在阅读文本文件后如何将它们恢复到我的程序中?
答案 0 :(得分:12)
使用time_t
将struct tm
转换为gmtime()
,然后使用struct tm
将strftime()
转换为纯文本(最好是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
强制转换为long
(long long
,如果您有C99编译器),请写入long
值,读取值并转回time_t
。
标准不保证time_t
甚至可以表示为长:它只表示time_t
是算术类型,但上面的技巧应适用于所有理智的系统: - )