如何获得 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-14 和 1901-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。
在我现代的 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
:
/* 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-14 和 1901-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。