日期 - 1901 年之前的年份被视为无效

日期 - 1901 年之前的年份被视为无效

我的系统上安装了 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_MINC 语言,最小 32 位有符号整数)
1901-12-13 00:00: 00 美国东部时间为 -2147540400

您可以尝试使用 1901-12-13 15:45:52 EST。它应该可以工作,但早一秒可能会像 1901-12-13 00:00 一样失败。

相关内容