日期与时间函数与夏令时的关系

测试环境: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值