命名空间
变体
操作

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 - 指向 tm 对象的指针,指定要转换的本地日历时间

[编辑] 返回值

自纪元以来的时间,表示为 time_t 对象,如果成功,否则为 -1,如果 arg 无法表示为 time_t 对象(POSIX 在这种情况下还要求将 EOVERFLOW 存储在 errno 中)。

[编辑] 备注

如果 struct tm 对象是从 POSIX strptime 或等效函数获得的,则 tm_isdst 的值是不确定的,需要在调用 mktime 之前明确设置。

[编辑] 示例

#define _POSIX_C_SOURCE 200112L // for setenv on gcc
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main(void)
{
    setenv("TZ", "/usr/share/zoneinfo/America/New_York", 1); // POSIX-specific
 
    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 is now outside its normal range
    mktime(&tm);       // tm_isdst is not set to -1; today's DST status is used
    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)

[编辑] 参考

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

[编辑] 另请参见

将自纪元以来的时间转换为表示为本地时间的日历时间
(函数) [编辑]
C++ 文档 for mktime