mktime

来自cppreference.com
< c‎ | chrono
在标头 <time.h> 定义
time_t mktime( struct tm *arg );

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

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

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

参数

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

返回值

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

注解

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

示例

#define _POSIX_C_SOURCE 200112L // 为 GCC 的 setenv
#include <stdio.h>
#include <stdlib.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("今天是       %s", asctime(&tm));
    printf("(DST %s)\n", tm.tm_isdst ? "生效" : "未生效");
    tm.tm_mon -= 100;  // tm_mon 落在正常范围外
    mktime(&tm);       // tm_isdst 不被设为 -1 ;使用今日的 DST 状态
    printf("100 个月前是 %s", asctime(&tm));
    printf("(DST %s)\n", tm.tm_isdst ? "生效" : "未生效");
}

可能的输出:

今天是       Fri Apr 22 11:53:36 2016
(DST 生效)
100 个月前是 Sat Dec 22 10:53:36 2007
(DST 未生效)

引用

  • C23 标准(ISO/IEC 9899:2024):
  • 7.27.2.3 The mktime function (第 TBD 页)
  • C17 标准(ISO/IEC 9899:2018):
  • 7.27.2.3 The mktime function (第 285-286 页)
  • C11 标准(ISO/IEC 9899:2011):
  • 7.27.2.3 The mktime function (第 390-391 页)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.23.2.3 The mktime function (第 340-341 页)
  • C89/C90 标准(ISO/IEC 9899:1990):
  • 4.12.2.3 The mktime function

参阅

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