3.3.4.时间相关API实战2
3.3.4.1、mktime
(1) 从OS中读取时间时用不到mktime的,这个mktime是用来向操作系统设置时间时用的。
3.3.4.2、asctime
(1) asctime得到一个固定格式的字符串格式的当前时间,效果上和ctime一样的。区别是ctime从time_t出发,而asctime从struct tm出发。
代码:
#include <stdio.h>
#include <time.h>
#include <string.h>
int main(void)
{
time_t tNow = -1;
/* 定义一个 gmtime_r 的 结构体变量tm 类型 tmNow变量 */
struct tm tmNow;
/* time */
time(&tNow);//使用 第 1 种返回值 把地址传进来
if(tNow < 0)
{
perror("time");
return -1;
}
/* time */
printf("time: %ld \n", tNow);
/* ctime */
printf("ctime: %s \n",ctime(&tNow)); //ctime 直接得到当前 时间
#if 0
/* gmtime_r 不可重入函数 ,需要自己分配内存 */
memset(&tmNow, 0, sizeof(tmNow));//清空 结构体变了 tmNow
gmtime_r(&tNow, &tmNow);
printf("gmtime_r: %d年 %d月 %d日 一年中多少天%d天 几点%d 时 \n",tmNow.tm_year, tmNow.tm_mon, tmNow.tm_mday, tmNow.tm_yday, tmNow.tm_hour );
#endif
/* localtime_r 不可重入函数 ,需要自己分配内存 */
memset(&tmNow, 0, sizeof(tmNow));//清空 结构体变了 tmNow
localtime_r(&tNow, &tmNow); // localtime() 传一个 time_t tNOW, 得到了一个 struct tm tmNow 的结构体信息
printf("localtime_r: %d年 %d月 %d日 一年中多少天%d天 几点%d 时 \n",tmNow.tm_year, tmNow.tm_mon, tmNow.tm_mday, tmNow.tm_yday, tmNow.tm_hour );
/* asctime */
printf("asctime: %s \n",asctime(&tmNow));
return 0;
}
运行结果:
3.3.4.3、strftime
(1)asctime和ctime得到的时间字符串都是固定格式的,没法用户自定义格式
(2)如果需要用户自定义时间的格式,则需要用strftime。
代码:
#include <stdio.h>
#include <time.h>
#include <string.h>
int main(void)
{
time_t tNow = -1;
/* 定义一个 gmtime_r 的 结构体变量tm 类型 tmNow变量 */
struct tm tmNow;
/* time */
time(&tNow);//使用 第 1 种返回值 把地址传进来
/* strftime 的 buf */
char buf[100];
if(tNow < 0)
{
perror("time");
return -1;
}
/* time */
printf("time: %ld \n", tNow);
/* ctime */
printf("ctime: %s \n",ctime(&tNow)); //ctime 直接得到当前 时间
#if 0
/* gmtime_r 不可重入函数 ,需要自己分配内存 */
memset(&tmNow, 0, sizeof(tmNow));//清空 结构体变了 tmNow
gmtime_r(&tNow, &tmNow);
printf("gmtime_r: %d年 %d月 %d日 一年中多少天%d天 几点%d 时 \n",tmNow.tm_year, tmNow.tm_mon, tmNow.tm_mday, tmNow.tm_yday, tmNow.tm_hour );
#endif
/* localtime_r 不可重入函数 ,需要自己分配内存 */
memset(&tmNow, 0, sizeof(tmNow));//清空 结构体变了 tmNow
localtime_r(&tNow, &tmNow); // localtime() 传一个 time_t tNOW, 得到了一个 struct tm tmNow 的结构体信息
printf("localtime_r: %d年 %d月 %d日 一年中多少天%d天 几点%d 时 \n",tmNow.tm_year, tmNow.tm_mon, tmNow.tm_mday, tmNow.tm_yday, tmNow.tm_hour );
/* strftime */
memset(&buf, 0, sizeof(buf));//清空 buf
/* 年-月-日, 时:分:秒 */
strftime(buf, sizeof(buf), "%Y-%m-%d, %H:%M:%S ", &tmNow);
printf(" strftime 时间为:[%s] \n",buf);
return 0;
}
运行结果:
总结 细节:
1. 首先需要一个 time 得到一个时间
/* time */
time(&tNow);//使用 第 1 种返回值 把地址传进来
2 . 还需要 一个 struct tm 的结构体变量 tmNow)
localtime_r(&tNow, &tmNow); // localtime() 传一个 time_t tNow, 得到了一个 struct tm tmNow 的结构体信息
3. 才能 由 strftime 得到一个 格式化的 时间, 存到了 buf 中
/* 年-月-日, 时:分:秒 */
strftime(buf, sizeof(buf), "%Y-%m-%d, %H:%M:%S ", &tmNow);
printf(" strftime 时间为:[%s] \n",buf);
这个格式: "%Y-%m-%d, %H:%M:%S "
3.3.4.4、gettimeofday和settimeofday
(1)前面讲到的基于time函数的那个系列都是以秒为单位来获取时间的,没有比秒更精确的时间。
(2)有时候我们程序希望得到非常精确的时间(譬如以us为单位),这时候就只能通过gettimeofday来实现了。
int gettimeofday(struct timeval *tv, struct timezone *tz); 输出型 参数
代码:
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <sys/time.h>
int main(void)
{
time_t tNow = -1;
/* time */
time(&tNow);//使用 第 1 种返回值 把地址传进来
/* gettimeofday 输出型参数 变量 定义 */
struct timeval tv ={0} ;
struct timezone tz = {0};
int ret = -1; /* gettimeofday 的返回值 */
if(tNow < 0)
{
perror("time");
return -1;
}
/* time */
printf("time: %ld \n", tNow);
/* gettimeofday */
memset(&tv, 0, sizeof(tv));//清空 tv
memset(&tz, 0, sizeof(tz));//清空 tz
ret = gettimeofday(&tv, &tz);
if(ret < 0)
{
perror("gettimeofday");
return -1;
}
printf("gettimeofday : seconde秒 : %ld. \n", tv.tv_sec);
printf("gettimeofday : timezone时区 : %d. \n", tz.tz_minuteswest);
return 0;
}
运行结果:
代码来自:
朱老师物联网大讲堂