mktime
定义于头文件 <time.h>
|
||
重整化表示成 struct tm 的本地日历时间,并将其转化成从纪元开始经过时间的 time_t 对象格式。忽略 time->tm_wday
与 time->tm_yday
。容许 time
中的值在其正常范围外。
time->tm_isdst
的负值会导致 mktime
尝试确定在指定时间夏时令是否有效。
若转换到 time_t
成功,则修改 time
会被修改。更新 time
的所有域为符合其正确范围的值。用可用于其他域的信息重新计算 time->tm_wday
与 time->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
参阅
(C11) |
将从纪元开始的时间转换成以本地时间表示的日历时间 (函数) |