我的系统上安装了 date (GNU coreutils) 7.1。
如果我尝试检查 1901 年 12 月 14 日之前的日期,则会收到“无效日期”错误。例如,
$ date -d 1901-12-13
date: invalid date `1901-12-13'
$ date -d 1901-12-14
Sat Dec 14 00:00:00 EST 1901
我应该怎样做才能使date
实用程序将 1901 年之前的年份视为有效?
对于 2038 年 1 月 19 日之后的日期,我收到类似的错误
答案1
好问题。
这文档说应该允许。
info date 'Date input formats' 'Calendar date items'
对于数字月份,允许使用 ISO 8601 格式“YEAR-MONTH-DAY”,其中 YEAR 是任何正数,...
如果数字小于十,则必须存在前导零。
如果 YEAR 为 68 或更小,则添加 2000;否则,如果 YEAR 小于 100,则添加 1900。
你是32位系统吗?
2038-01-20 之后的日期是否也会出现错误,例如
date -d '2038-01-20'
如果是这样,听起来 GNU 日期正在使用 32 位时间值。
例如,除了使用 64 位系统或使用不同的工具之外,我不确定如何解决此问题约会时间在 Perl 或约会时间在Python中。
一些背景:
Unix 时间使用整数值计算自 1970 年 1 月 1 日起的秒数。如果系统使用 32 位整数,则只能向前计算 21 亿秒(截至 2038-01-19 03:14:02 UTC)和向后计算 21 亿秒(回到 1901-12-13 20:45:52)世界标准时间)。
更多信息请访问:
答案2
您的系统(或至少是该版本的日期) 可能使用 32 位内部时间值。
Unix 纪元(零时间值)是 1970-01-01 00:00:00 UTC。此起点将 1901-12-13 00:00 EST 置于有符号 32 位时间值的范围之外。
1901-12-14 00:00:00 EST 为 -2147454000
1901-12-13 15:45:52 EST 为 -2147483648 (又名INT_MIN
C 语言,最小 32 位有符号整数)
1901-12-13 00:00: 00 美国东部时间为 -2147540400
您可以尝试使用 1901-12-13 15:45:52 EST。它应该可以工作,但早一秒可能会像 1901-12-13 00:00 一样失败。