mktime

来自cppreference.com
< c‎ | chrono
定义于头文件 <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亦要求这种情况下将EOVERFLOW存储于errno中)。

[编辑] 注意

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

[编辑] 参阅

将从纪元开始的时间转换成以本地时间表示的日历时间
(函数) [edit]
mktimeC++文档