1 背景
最近在开发中使用C标准库函数mktime,出了一些问题,虽然解决了,还是将解决过程记录下来供后续参考.
函数定义如下:
#inclide <time.h>
time_t mktime(struct tm *tm);
2 问题
调用代码:
struct tm t;
t.tm_hour = 0; /* Hours (0-23) */
t.tm_min = 0; /* Minutes (0-59) */
t.tm_sec = 0; /* Seconds (0-60) */
t.tm_year = 70; /* Year - 1900 */
t.tm_mon = 0; /* Month (0-11) */
t.tm_mday = 1; /* Day of the month (1-31) */
t.tm_isdst = 0; /* Day in the year (0-365, 1 Jan = 0) */
t.tm_wday = 0; /* Day of the week (0-6, Sunday = 0) */
t.tm_yday = 0; /* Daylight saving time */
time_t time = mktime(&t);
printf("time: %ld\n", time);
printf("tm_wday: %d\n", t.tm_wday);
运行结果:
time: -1
tm_wday: 0
mktime返回值为-1表示输入参数不合法,以上参数是从1970年1月1日0点0分0秒开始的时间,为什么返回-1呢?
3 解决
后查阅mktime函数说明,发现struct tm结构体描述时间是本地时间,我们所在时区是8,将t.tm_hour修改为8后代码如下:
struct tm t;
t.tm_hour = 8; /* Hours (0-23) */
t.tm_min = 0; /* Minutes (0-59) */
t.tm_sec = 0; /* Seconds (0-60) */
t.tm_year = 70; /* Year - 1900 */
t.tm_mon = 0; /* Month (0-11) */
t.tm_mday = 1; /* Day of the month (1-31) */
t.tm_isdst = 0; /* Day in the year (0-365, 1 Jan = 0) */
t.tm_wday = 0; /* Day of the week (0-6, Sunday = 0) */
t.tm_yday = 0; /* Daylight saving time */
time_t time = mktime(&t);
printf("time: %ld\n", time);
printf("tm_wday: %d\n", t.tm_wday);
运行结果:
time: 0
tm_wday: 4
返回值正确,1970年1月1日这天是星期四。
4 总结
mktime参数要求时间是从1970年1月1日0点0分0秒开始时间,不过需要时本地时间,需要根据时区调整t.tm_hour值,才能返回正确的值。