当前位置: C语言 -- 标准库 -- <time.h> -- mktime

mktime函数


概要:
#include <time.h>
time_t mktime(struct tm *timeptr);

描述:

该函数将参数timeptr指向结构中以本地时间表示的分解时间转换为与time函数返回值具有相同编码的日历时间。

结构成员tm_wday和tm_yday原始值会被忽略;其它结构成员即使超出有效范围,也会被解释,例如:结构成员tm_mday值可能大于31,会被解释为所选月份最后一天之后的天数。成功调用函数后,结构成员tm_wday和tm_yday的值会被合理设置,其它结构成员会被设置成表示指定的日历时间,但它们的值会被强制到有效范围内;在结构成员tm_mon和tm_year的值确定之前,不会设置结构成员tm_mday的值。

如果转换所使用的本地时间涉及夏令时调整(Daylight Saving Time adjustments),结构成员tm_isdst为正数或者0时,会使mktime函数按照实行夏令时或者不实行夏令时来进行转换。如果结构成员tm_isdst为负数,mktime函数尝试判断是否实行夏令时;如果认为实行夏令时,将产生与结构成员tm_isdst为正数时调用的相同结果;否则产生与结构成员tm_isdst为0时调用的相同结果。如果参数timeptr指定的时间正好是夏令时开始或者结束时跳过或者重复的那个时间,mktime函数调用结果究竟等同于tm_isdst为正数时的调用,还是等同于tm_isdst为0时的调用,ISO/IEC 9899标准未作明确规定。

如果调用成功,mktime函数会把参数timeptr指向结构中的各个成员设置成:与用计算得到的日历时间调用localtime函数返回值的成员值相同。


参数:
struct tm *timeptr

参数为指向struct tm类型对象的指针。


返回值:

函数返回编码为time_t类型的指定日历时间。如果日历时间无法使用time_t类型表示,或者参数timeptr指向结构的成员tm_year无法使用int类型表示,函数返回(time_t)(-1),并且不改变结构成员tm_wday的值。


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
/*函数mktime范例*/

#include <stdio.h>
#include <time.h>

int main(void)
{
   const char *weekDay[] = {
        "Sunday", "Monday","Tuesday","Wednesday",
        "Thursday","Friday","Saturday"
    };
    const char *month[] = {
         "January", "February", "March", "April",
         "May", "June", "July", "August", "September",
         "October", "November", "December"
    };
    struct tm queryDate = {0};

    /*输入查询的日期。*/
    puts("Enter year: ");
    scanf("%d", &(queryDate.tm_year));
    
    puts("Enter month: ");
    scanf("%d", &(queryDate.tm_mon));
    
    puts("Enter day: ");
    scanf("%d", &(queryDate.tm_mday));
    
    /*将数据处理成struct tm要求的格式。*/
    queryDate.tm_year -= 1900;
    queryDate.tm_mon -= 1;

    /*输出查询日期是星期几。*/
    if(mktime(&queryDate) == (time_t)(-1))
        puts("The calendar time can not be represented.");
    else
        printf("%s %d, %d is %s.\n", month[queryDate.tm_mon],    \
               queryDate.tm_mday, queryDate.tm_year+1900, weekDay[queryDate.tm_wday]);

    return 0;
}


结果:

假设输入:

Enter year:

1975

Enter month:

8

Enter day:

16

将输出:

August 16, 1975 is Saturday.


1970年1月1日是一个重要的时间节点,有些实现(例如:GCC、Visual Studio)对这个时间节点后的日历时间能够正常表示;但之前的日历时间不能正常表示。


相关内容:
struct tm 表示分解时间的结构类型。
timegm 将UTC时间表示的分解时间转换为time_t类型日历时间的函数。
time_t 表示日历时间的实数类型。


主要参考资料:

1、ISO/IEC 9899:2024

2、ISO/IEC 9899:2018