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 值
#include
#include
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.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)。