这是一个测试时候发现的问题,2011 年 13 月 32 日 24 点 60 分 60 秒,这个时间存在吗?
我觉得这应该是个错误的时间,但很不幸地是,如果往 struct tm 中填入这个时间,mktime() 时并不会报错。下面是一段简单的测试代码:
#include <stdio.h>
#include <string.h>
#include <time.h>int main()
{
struct tm t;
memset(&t, 0, sizeof(t));
t.tm_year = 2011-1900;
t.tm_mon = 13-1;
t.tm_mday = 32;
t.tm_hour = 24;
t.tm_min = 60;
t.tm_sec = 60;
printf("tm_mon=%d, tm_mday=%d, tm_hour=%d, tm_min=%d, tm_sec=%d\n",
t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
time_t tt = mktime(&t);
printf("%s", ctime(&tt));
printf("tm_mon=%d, tm_mday=%d, tm_hour=%d, tm_min=%d, tm_sec=%d\n",
t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
}
这个程序执行的结果是:
$ ./a.out tm_mon=12, tm_mday=32, tm_hour=24, tm_min=60, tm_sec=60 Thu Feb 2 01:01:00 2012 tm_mon=1, tm_mday=2, tm_hour=1, tm_min=1, tm_sec=0
查看 man mktime,的确有对这个特性的解释:
...if structure members are outside their valid interval, they will be normalized (so that, for example, 40 October is changed into 9 November);...
这就意味着,对输入时间做严格的检查无法依赖于标准库中的 mktime() 函数,只能自己来进行。这应该也是 date 命令曾经改进过的地方。
$ date -d "2011-13-32" # date (coreutils) 5.2.1 Wed Feb 1 00:00:00 CST 2012 $ date -d "2011-13-32" # date (GNU coreutils) 8.5 date: invalid date `2011-13-32'