if [ "$1" = "?" ] then echo "功能:取得某日期的任意天前或后的日期 Usage:date_g [-b|-a] [n(days)] [Now(yyyymmdd)] -b 表示往前的日期 -a 表示往后的日期,缺省为-a 1,即往后一天 n 表示间隔的天数,缺省为1 Now 表示基点日期,缺省为当前日期 如:date_g -a 365 20050210,结果为20060210" exit fi
####参数2表示间隔天数,缺省为1天 Pre=1 if [ "$2" != "" ] then Pre=$2 fi
####参数3表示基点日期,缺省为当前系统日期 ####如果要输入特定的基点日期,参数2则不能省略 if [ "$3" != "" ] then Len=`expr length "$3"` if [ $Len != 8 ] then echo "非法基点日期[$Len]!!" exit fi year=`echo $3|awk '{print substr($1,1,4)}'` month=`echo $3|awk '{print substr($1,5,2)}'` day=`echo $3|awk '{print substr($1,7,2)}'` DateP=$3 else month=`date +%m` day=`date +%d` year=`date +%Y` DateP=`date +'%Y%m%d'` fi
####参数1表示向前或向后计数 if [ "$1" = "-a" ] then day=`expr $day + $Pre` Ss="后" else day=`expr $day - $Pre` Ss="前" fi
####函数mon_max_day获得每个月的最大天数 ####参数一:月数(1-12) ####输出:显示最大天数 mon_max_day() { day=0 if [ $1 -gt 0 -a $1 -lt 13 ] then case $1 in 1|01|3|03|5|05|7|07|8|08|10|12) day=31;; 4|04|6|06|9|09|11) day=30;; 2|02) if [ `expr $year % 4` -eq 0 ]; then if [ `expr $year % 400` -eq 0 ]; then day=29 elif [ `expr $year % 100` -eq 0 ]; then day=28 else day=29 fi else day=28 fi;; esac fi printf $day }
####主程序开始 Max=`mon_max_day $month`
####针对向前的情况 while [ $day -le 0 ] do month=`expr $month - 1` if [ $month -eq 0 ] then month=12 year=`expr $year - 1` fi Max=`mon_max_day $month` day=`expr $day + $Max` done
####针对向后的情况 while [ $day -gt $Max ] do day=`expr $day - $Max` month=`expr $month + 1` if [ $month -eq 13 ] then month=1 year=`expr $year + 1` fi Max=`mon_max_day $month` done