#!/bin/sh # offset_date # # calculates the date differing from the current date (default) or a # given starting date by a given offset number of days # # usage: offset_date yyyymmdd noff *or* offset_date noff usage () { echo "Usage:" echo " offset_date yyyymmdd noff" echo " or" echo " offset_date noff" echo " Returns the date differing by noff days from today (default)" echo " or a given starting date, both in the form of yyyymmdd." } if [ $# != 2 ] then usage exit fi # convert default or input yyyymmdd to a julian date if [ $# = 2 ] then jul=`ymd2yd $1` off=$2 else today=`date -u +%Y%m%d` jul=`ymd2yd $today` off=$1 fi #echo "Julian start = $jul" # Break the date in to year and day portions yyyy=`expr $jul / 1000` ddd=`expr $jul % 1000` # Apply offset to julian day dddoff=`expr $ddd + $off` #echo "dddoff = $dddoff" if [ `expr $off \< 0` = 1 ] then # negative offset, work backwards # decrement year and add days in year to offset result until days > 0 while [ `expr $dddoff \< 1` = 1 ] do yyyy=`expr $yyyy - 1` diy=`yeardays $yyyy` dddoff=`expr $dddoff + $diy` done else # positive offset, work forwards. # increment year and subtract days in year from offset result until # days < days_in_year diy=`yeardays $yyyy` while [ `expr $dddoff \> $diy` = 1 ] do dddoff=`expr $dddoff - $diy` yyyy=`expr $yyyy + 1` diy=`yeardays $yyyy` done fi juloff=`expr $yyyy \* 1000 + $dddoff` #echo "Juloff = $juloff" newdate=`yd2ymd $juloff` # output the results echo $newdate