C 参考手册

定义于头文件 <time.h>
time_t mktime( struct tm *time );

重整化表示成 struct tm 的本地日历时间,并将其转化成从纪元开始经过时间的 time_t 对象格式。忽略 time->tm_wdaytime->tm_yday 。容许 time 中的值在其正常范围外。

time->tm_isdst 的负值会导致 mktime 尝试确定在指定时间夏时令是否有效。

若转换到 time_t 成功,则修改 time 会被修改。更新 time 的所有域为符合其正确范围的值。用可用于其他域的信息重新计算 time->tm_wdaytime->tm_yday

参数

time - 指向 struct tm 对象的指针,它指定要转换的本地日历时间

返回值

成功时返回表示从纪元开始时间的 time_t 对象,若 time 不能表示成 time_t 对象则返回 -1 ( POSIX 亦要求此情况下存储 EOVERFLOWerrno 中)。

注意

struct tm 对象是由 POSIX strptime 或等价的函数取得的,则 tm_isdst 的值不确定,并需要在调用 mktime 前显式设置。

示例

#define _POSIX_C_SOURCE 200112L // 为 GCC 的 setenv
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
 
int main(void)
{
    setenv("TZ", "/usr/share/zoneinfo/America/New_York", 1); // POSIX 限定
 
    struct tm tm = *localtime(&(time_t){time(NULL)});
    printf("Today is           %s", asctime(&tm));
    printf("(DST is %s)\n", tm.tm_isdst ? "in effect" : "not in effect");
    tm.tm_mon -= 100;  // tm_mon 落在正常范围外
    mktime(&tm);       // tm_dst 不被设为 -1 ;使用今日的 DST 状态
    printf("100 months ago was %s", asctime(&tm));
    printf("(DST was %s)\n", tm.tm_isdst ? "in effect" : "not in effect");
}

输出:

Today is           Fri Apr 22 11:53:36 2016
(DST is in effect)
100 months ago was Sat Dec 22 10:53:36 2007
(DST was not in effect)

引用

  • C11 standard (ISO/IEC 9899:2011):
  • 7.27.2.3 The mktime function (p: 390-391)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.23.2.3 The mktime function (p: 340-341)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.12.2.3 The mktime function

参阅

将从纪元开始的时间转换成以本地时间表示的日历时间
(函数)