时间戳的三种需求格式:time_t char* struct tm
下图为三种需求格式之间相互转换需要用到的函数。
time(),gmtime(),localtime(),mktime(),strftime()
localtime中返回值struct tm*,指向静态区
time()函数
#include <time.h>
time_t time(time_t *t);
此函数会返回从公元 1970 年1 月1 日的UTC 时间从0 时0 分0 秒算起到现在所经过的秒数。如果t 并非空指针的话,此函数也会将返回值存到t 指针所指的内存。
timer=NULL时,得到机器日历时间
返回值:
成功则返回秒数,失败则返回((time_t)-1)值,错误原因存于errno 中。
strftime();
将参数4中的time按照参数3的要求获取,然后写入到参数1中。参数1的大小由参数2限制。
time_t mktime(struct tm *tm)
//将struct tm格式转换为time_t格式,如果中间数据有溢出,则自动调整时间
//FS/100day.c
struct tm *tm;
time_t timestamp;
char timestr[BUFFSIZE];
timestamp = time(NULL);
tm = localtime(×tamp);
/*
fprintf(stdout, "time: %d-%d-%d %d:%d:%d\n", \
tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, \
tm->tm_min, tm->tm_sec);
*/
strftime(timestr, BUFFSIZE,"Now: %Y-%m-%d" ,tm);
puts(timestr);
tm->tm_mday += 100;
mktime(tm);
strftime(timestr, BUFFSIZE,"100 days later: %Y-%m-%d" ,tm);
puts(timestr);
//FS/timelog.c
/*
把当前时间按照相应格式每秒钟写入到一个文件中去,用另一个终端
采用“tail -f 文件” 监测写入的中间状态
1.fopen的a+模式;
2.time_t,localtime
3.除了终端设备,其他设备默认是全缓冲形式,需要采用fflush不断刷新,
才能看到中间过程
*/
char buf[BUFFSIZE];
int count;
count = 0;
while(fgets(buf, BUFFSIZE, fp) != NULL)
{
count++;
}
time_t stamp;
struct tm* tm;
while(1)
{
time(&stamp);
tm = localtime(&stamp);
fprintf(fp, "%-4d%d-%d-%d %d:%d:%d\n", ++count,\
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,\
tm->tm_hour, tm->tm_min, tm->tm_sec);
fflush(fp);
sleep(1);
}