Q:

Calculate the date from 1125 days ago on non-GNU systems?

On the Unix Bash commandline, I want to calculate the date from 1125 days ago using the base operating system (e.g. No Perl or Python).
On systems running GNU Date, I can do something like this:
ubuntu $ date --date="1125 days ago"
Wed Nov  7 15:12:33 PST 2007

FreeBSD or MacOSX systems don't ship with GNU Date, and don't support values like "X days ago".
freebsd81 $ date --date="+1125 days ago"
date: illegal option -- -

I can calculate a date from a few days ago on a Mac or FreeBSD system, but this is limited to a few days:
# Today is really Dec 6, 2010. 4 days ago it was:
macosx $ TZ=GMT+96 date +%Y%m%d
20101202

# But that doesn't work if I want to see the date 8 days ago:
macosx $ TZ=GMT+192 date +%Y%m%d
20101206

Can I calculate old dates on non-GNU systems without delving into tools like Perl or Python? Or must I use a more powerful scripting language?

A:

Well, you can do something sneaky like:  

$ echo "`date +%s` - (1125 * 24 * 60 *60)" |bc
1194478815
$ date -r 1194478689
Wed, 07 Nov 2007 18:38:09 -0500

Tested on OpenBSD (definitely non gnu based date), and seems to work.
Breaking it down in steps:

get the current unixtime (seconds since beginning of unix epoch): 

  $ date +%s
  1291679934
  

get the number of seconds in 1125 days

  $ echo "1125 * 24 * 60 *60" | bc
  97200000
  

subtract one from the other (1291679934 - 97200000) = 1194478815
use the new unixtime (1194478815) to print a pretty date

$ date -r 1194478689
Wed, 07 Nov 2007 18:38:09 -0500

As an alternative, on solaris you can do this to print the date*:
/bin/echo "0t1194478815>Y\n<Y=Y" |adb

* referenced from http://www.sun.com/bigadmin/shellme/
Also, an alternative on Solaris for getting the current timestamp from the date command** is:
    /usr/bin/truss /usr/bin/date 2>&1 |  nawk -F= '/^time()/ {gsub(/ /,"",$2);print $2}'
** referenced from http://www.commandlinefu.com/commands/view/7647/unix-timestamp-solaris

