如何获得 representable/accepted by date(1)/mktime(3) 的日期范围?

How to get range of dates that are representable/accepted by date(1)/mktime(3)?

在我现代的 64 位 Mac 上,日期 1901-12-14 是以下命令最早接受的日期:

date -ju -f "%F" "1901-12-14" "+%s"

我检查了 macOS date 命令 here (Apple Open Source) 的源代码,这是一个失败的 mktime 调用,它给出了较早日期的 date: nonexistent time 错误。

我查看了 mktime here (Apple Open Source) 的来源,我认为这是一个整数表示问题,但我不确定。

如何查找或计算 date 命令(实际上是 mktime)可接受的日期范围?

而且,如果我想获取 mktime 内部无法表示的日期的 Unix 时间,还有哪些其他库或函数可以处理更早的日期?

mktime(3) 的当前 macOS (OS X) 实现支持的最小 Unix 时间为 INT32_MIN (-2147483648)。这是因为 localtime.c:2102 假定如果值小于 INT32_MAX:

,结果将适合 32 位整数
/* optimization: see if the value is 31-bit (signed) */
t = (((time_t) 1) << (TYPE_BIT(int) - 1)) - 1;
bits = ((*funcp)(&t, offset, &mytm) == NULL || tmcomp(&mytm, &yourtm) < 0) ? TYPE_BIT(time_t) - 1 : TYPE_BIT(int) - 1;

1901-12-141901-12-13 之间,Unix 时间低于 INT32_MIN,需要更多超过 32 位,并且仍然小于 INT32_MAX,导致 bits.

中的函数 运行

考虑到 1900 年之前的值被 localtime.c:2073 明确禁止,这不是什么大问题:

/* Don't go below 1900 for POLA */
if (yourtm.tm_year < 0)
        return WRONG;

(POLA:最小惊讶原则)

此外,time_t 不是 required to be signed