菜鸟笔记
提升您的技术认知

mktime时间函数

1.函数说明

1.1描述

time_t mktime(struct tm *timeptr)timeptr 所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数,发生错误时返回-1。

1.2.声明

​ time_t mktime(struct tm *timeptr)

1.3.参数

struct tm 
{  
    int tm_sec;		  /* 秒 – 取值[0,59] */   
    int tm_min; 	  /* 分 - 取值[0,59] */   
    int tm_hour; 	  /* 时 - 取值[0,23] */   
    int tm_mday;	  /* 日 - 取值[1,31] */  
    int tm_mon;		  /* 月 - 取值[0,11] */ 
    int tm_year; 	  /* 年 - 取值从1900开始 */  
    int tm_wday; 	  /* 星期–取值[0,6],其中0代表星期天,1代表星期一*/  
    int tm_yday; 	  /* 从每年的1月1日开始的天数–取值[0,365] */  
    int tm_isdst; 	  /* 是否采用夏令时–取值[-1,0,1] :采用夏令时,tm_isdst为1;不采用夏令时,tm_isdst为0;不了解情况时,tm_isdst()为-1;*/  
# ifdef	__USE_MISC
  long int tm_gmtoff;		/* 指定了日期变更线东面时区中UTC东部时区正秒数或UTC西部时区的负秒数  */
  const char *tm_zone;		/* 时区(与环境变量TZ有关)*/
# else
  long int __tm_gmtoff;		
  const char *__tm_zone;	
# endif
}

1.4.返回值

​ 该函数返回自 1970 年 1 月 1 日以来持续时间的秒数。如果发生错误,则返回 -1 值

2.实例

#include <stdio.h>
#include <time.h>
int main () {
      int ret;
      struct tm info;
      char buffer[80];

      info.tm_year = 2021 - 1900;
      info.tm_mon = 7 - 1;
      info.tm_mday = 4;
      info.tm_hour = 0;
      info.tm_min = 0;
      info.tm_sec = 1;
      info.tm_isdst = -1;

      ret = mktime(&info);
      if( ret == -1 ) {
        printf("Error: unable to make time using mktime**\n**");
      } else {
        strftime(buffer, sizeof(buffer), "%c", &info );
        printf(buffer);
      }
      return(0);
}

6.注意要点

6.1.夏令时

​ 到夏天就将时间提前一小时,也有提前半小时或几小时的;到了冬季,又将拨快的时间拨回来

您指定的日期有夏令时生效,但在调用mktime时,storage.tm_isdst为零。 mktime看到了这一点,并认为“嘿,他们给了我一个日期不正确的夏令时标志,让我们解决它”。然后,它将tm_isdst设置为1并更改tm_hour。

6.2关于tm_isdst

​ 如果未对struct tm变量初始化,或对tm_isdst初始化,那么tm_isdst会被被设置为随机值,结果可能出现异常。(UBUNTU18.04返回结果正常,UBUNU20.04可能返回-1)。