从glibc 的实现中我们读到:
我们限制了可以打印的年份的大小。使用 %d 格式说明符,加上 1900 会溢出数字并打印负值。对于某些架构,我们理论上可以使用 %ld 或更大的整数格式,但这意味着输出需要更多空间。如果 'asctime_r' 接口被合理定义并且缓冲区大小将被传递,这将不是问题。
运行下面的程序以找到您机器上的确切限制。
#include <limits.h>
#include <stdio.h>
#include <time.h>
/**
* Find the largest time_t for which ctime returns a non-NULL value
* using a bsearch between 0 and LONG_MAX.
**/
static time_t ctime_max() {
time_t start = 0, end = LONG_MAX, mid;
while (start < end) {
mid = start + (end - start) / 2;
if (ctime(&mid)) {
/* this mid is ctime-able; try higher */
start = mid + 1;
} else {
/* this mid is not ctime-able; try lower */
end = mid;
}
}
/* mid is now the lowest number that's too high; subtract one */
return mid - 1;
}
int main() {
time_t t = ctime_max();
printf("%s", ctime(&t));
return 0;
}
对我来说,Tue Dec 31 23:59:59 2147483647
这恰好是一年溢出四个有符号字节之前的第二个。