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

Jas*_*ngh 11 shell-script date

我的系统上安装了 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
Run Code Online (Sandbox Code Playgroud)

我应该怎么做才能使date实用程序将 1901 年之前的年份视为有效?

我收到 2038 年 1 月 19 日之后日期的类似错误

Mik*_*kel 15

好问题。

文件说,它应该被允许。

 info date 'Date input formats' 'Calendar date items'
Run Code Online (Sandbox Code Playgroud)

对于数字月份,允许使用 ISO 8601 格式“YEAR-MONTH-DAY”,其中 YEAR 是任何正数,...

如果数字小于十,则必须存在前导零。

如果 YEAR 为 68 或更小,则添加 2000;否则,如果 YEAR 小于 100,则添加 1900。

你是 32 位系统吗?

您是否也收到 2038-01-20 之后的日期错误,例如

date -d '2038-01-20'
Run Code Online (Sandbox Code Playgroud)

如果是这样,听起来 GNU 日期使用的是 32 位时间值。

除了使用 64 位系统或使用其他工具(例如Perl 中的DateTime或Python 中的datetime)之外,我不确定如何解决此问题。

一些背景:

Unix 时间使用整数值计算从 1970 年 1 月 1 日开始的秒数。如果系统使用 32 位整数,则只能向前计数 21 亿秒(到 2038-01-19 03:14:02 UTC)和向后计数 21 亿秒(回到 1901-12-13 20:45:52世界标准时间)。

更多信息请访问:


Chr*_*sen 7

您的系统(或至少该版本的date)可能正在使用 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-10:00 00 美国东部时间是 -2147540400

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