GNU日期命令不允许很远的年份?

时间:2016-05-11 19:37:48

标签: linux bash shell date

使用GNU日期运行以下命令时:

date -d "20145-01-23"

我得到以下结果:

  

日期:无效日期`20145-01-23'

但是,the manual表示该年份可以是任何数字:

  

对于数字月份,允许使用ISO 8601格式“年 - 月 - 日”,其中年份为正数[...]

因此,有两个问题:

  • 这是一个错误吗?或者我误解了什么?
  • 如何获得与BSD日期相同的行为,该日期将其视为有效日期?

2 个答案:

答案 0 :(得分:3)

这适用于我,使用GNU coreutils 8.24:

$ date -d "20145-01-23"
Sat Jan 23 00:00:00 PST 20145

我不确定这个解释( 更新: 看起来我的猜测是正确的),但我的猜测是您使用的是32位time_t而不是64位的系统。有32位,唯一可表示的日期是从星期五1901-12-13 20:45:52 UTC(2 31 秒在纪元前)到星期二2038-01-19 03:14:07 UTC (2 31 在纪元后-1秒。)

如果是这种情况,则此命令应该成功:

$ date -d 2037-01-01
Thu Jan  1 00:00:00 PST 2037

这个应该失败:

$ date -d 2039-01-01
date: invalid date ‘2039-01-01’

(我已经重建了最后一个命令的结果。第一个命令的输出会根据你的时区略有不同。)

  

如何获得与BSD日期相同的行为,BSD日期将其视为有效日期?

你是说你想要 BSD日期拒绝吗?如果是这样(更多推测),要么运行32位版本的BSD,要么测试所请求的时间是否在32位时间戳范围之外。

答案 1 :(得分:0)

BSD date -d需要时区值。为了抵消年,日或其他,你传递-v NT ,其中N是数字,T是表示天,月或年的字符。

旗帜不同。有关常见的BSD变体,请参阅http://www.unix.com/man-page/All/1/date/了解Gnu版本,http://www.unix.com/man-page/FreeBSD/1/date/