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世界标准时间)。
更多信息请访问:
您的系统(或至少该版本的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 相同的方式失败。