That really depends on the implementation you are using:
In the version I have, there are no such limits:
$ date -d "120 years ago"
Wed 12 Aug 14:20:26 UTC 1903
$ date -d "5000 years ago"
Tue 12 Aug 14:21:26 UTC -2977
(of course, with so early dates the proleptic calendar being used must be taken with a grain of salt)
$ date -d "+9879566 years"
Sat 12 Aug 14:24:17 UTC 9881589
$ date -d "+1000000000 years"
Sat 12 Aug 14:23:39 UTC 1000002023
It lets me go up and down to more than 2 million years:
$ date -d "+2147483524 years"
Tue 12 Aug 14:29:19 UTC 2147485547
$ date -d "+2147483525 years"
date: invalid date '+2147483525 years'
(124 years less than 2³¹ = 2147483648)
$ date -d "2147483772 years ago"
date: invalid date '2147483772 years ago'
$ date -d "2147483771 years ago"
Thu 12 Aug 14:32:23 UTC -2147481748
(123 years less than 2³¹ = 2147483648)
Which suggests it is internally using a 32bit signed value on a struct tm
's tm_year (starting in 1900) when initially calculating the number of years to add or substract.
date (GNU coreutils) 8.32
versusdate (GNU coreutils) 8.28
date -d '11 Aug 5881588
?