测试环境:VMware12 pro+CentOS 7
- 时间结构介绍:
1. time_t 为从公元1970 年1 月1 日0 时0 分0 秒算起至今的UTC 时间所经过的秒数
2. 结构tm的定义为
struct tm{
int tm_sec; //代表目前秒数, 正常范围为0-59, 但允许至61 秒
int tm_min; //代表目前分数, 范围0-59
int tm_hour; //从午夜算起的时数, 范围为0-23
int tm_mday; //目前月份的日数, 范围01-31
int tm_mon; //代表目前月份, 从一月算起, 范围从0-11
int tm_year; //从1900 年算起至今的年数
int tm_wday; //一星期的日数, 从星期一算起, 范围为0-6
int tm_yday; //从今年1 月1 日算起至今的天数, 范围为0-365
int tm_isdst; //日光节约时间的旗标(夏令时的标志),大于0时使用夏令时,等于零时不使用夏令时,小于0时这个标志位无效
};
- 日期与时间函数介绍:(头文件为#include <time.h>)
1. time_t time(time_t *t);
该函数会返回从公元1970年1月1日的UTC时间从0时0分0秒算起到现在所经过的秒数,若传入的参数非空,此函数也会将返回值存入到t指针所指向的内存。
2. struct tm *gmtime(const time_t *timep); / struct tm *gmtime_r(const time_t *timep, struct tm *result);
该函数返回值为未经时区转换的时间,即UTC时间,但返回值指向一个静态分配的结构,该结构可能会被接下来的任何日期和时间函数调用覆盖。gmtime_r()函数功能与此相同,但是它可以将数据存储到用户提供的结构体中
3. struct tm *localtime(const time_t *timep); / struct tm *localtime_r(const time_t *timep, struct tm *result);
该函数返回值为已经转换为当前时区的时间,即DST时间(当前时区为夏令时时,返回的时间也为夏令时),但返回值指向一个静态分配的结构,该结构可能会被接下来的任何日期和时间函数调用覆盖。localtime_r()函数功能与此相同,但是它可以将数据存储到用户提供的结构体中。它不需要设置tm.
4. time_t mktime(strcut tm * timeptr);
该函数将参数timeptr所指的tm结构数据转换为time_t数据。tm中的标志位tm_isdst会影响函数的返回值。1为夏令时 0为非夏令时 -1则无效。
5. char *ctime(const time_t *timep);
该函数将参数timep所指的time_t结构中的信息转为由时区转换成的当地时间的字符串,和localtime一样,可能会有夏令时的影响。
6. char *asctime(const struct tm * timeptr);
该函数将但会字符串表示传入参数timeptr的日期时间,tm中的标志位tm_isdst会影响函数的返回值,若大于0则返回当前时区的夏令时,等于0则返回当前时区的标准时(冬令时)
- UTC与DST介绍:
UTC 世界协调时间,又称世界标准时间
DST 夏日节约时间,所以有夏令时的冬令时的区别
- 测试用例
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t t1, t3;
struct tm t2;
struct tm t4;
char buf[50];
t1 = time(NULL);
printf("%d\n", t1);
printf("%s", ctime(&t1));
gmtime_r(&t1,&t4);
printf("%d\n",t4.tm_isdst);
printf("%s",asctime(&t4));
localtime_r(&t1, &t2);
printf("%d\n",t2.tm_isdst);
printf("%s",asctime(&t2));
t2.tm_isdst = 1;
t3 = mktime(&t2);
printf("%d\n",t3);
t2.tm_isdst = -1;
t3 = mktime(&t2);
printf("%d\n",t3);
t2.tm_isdst = 0;
t3 = mktime(&t2);
printf("%d\n",t3);
}
结果:
[root@bogon ~]# date
Sun May 22 23:23:04 PDT 2016
[root@bogon ~]# ./main2
1463984646
Sun May 22 23:24:06 2016
0
Mon May 23 06:24:06 2016
1
Sun May 22 23:24:06 2016
1463984646
1463984646
1463988246
[root@bogon ~]# date
Sun May 22 22:26:08 PST 2016
[root@bogon ~]# ./main2
1463984772
Sun May 22 22:26:12 2016
0
Mon May 23 06:26:12 2016
0
Sun May 22 22:26:12 2016
1463984772
1463984772
1463984772