红联Linux门户
Linux帮助

万能的计算日期函数

发布时间:2006-02-11 09:54:36来源:红联作者:[Hl.y]
#!/bin/sh

####作者:RUIFOX
####功能:取得某日期的任意天前或后的日期

####参数1为?获得帮助

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


DateA=`printf "%02d%02d%02d" $year $month $day`
#echo "基点日期为[$DateP],[$Pre]天$Ss的日期为[$DateA]"
echo "$DateA"
文章评论

共有 24 条评论

  1. _iLu_ 于 2010-11-17 13:03:53发表:

    新手摸索中!

  2. _iLu_ 于 2010-11-17 13:03:48发表:

    新手摸索中!

  3. _iLu_ 于 2010-11-17 13:03:46发表:

    新手摸索中!

  4. _iLu_ 于 2010-11-17 13:03:42发表:

    新手摸索中!

  5. _iLu_ 于 2010-11-17 13:03:39发表:

    新手摸索中!

  6. _iLu_ 于 2010-11-17 13:03:37发表:

    新手摸索中!

  7. _iLu_ 于 2010-11-17 13:03:35发表:

    新手摸索中!

  8. _iLu_ 于 2010-11-17 13:03:33发表:

    新手摸索中!

  9. _iLu_ 于 2010-11-17 13:03:31发表:

    新手摸索中!

  10. _iLu_ 于 2010-11-17 13:03:28发表:

    新手摸索中!

  11. _iLu_ 于 2010-11-17 13:03:26发表:

    新手摸索中!

  12. _iLu_ 于 2010-11-17 13:03:23发表:

    新手摸索中!

  13. _iLu_ 于 2010-11-17 13:03:18发表:

    新手摸索中!

  14. _iLu_ 于 2010-11-17 13:03:16发表:

    新手摸索中!

  15. _iLu_ 于 2010-11-17 13:03:14发表:

    新手摸索中!

  16. _iLu_ 于 2010-11-17 13:03:12发表:

    新手摸索中!

  17. _iLu_ 于 2010-11-17 13:03:10发表:

    新手摸索中!

  18. _iLu_ 于 2010-11-17 13:03:04发表:

    新手摸索中!

  19. _iLu_ 于 2010-11-17 13:03:01发表:

    新手摸索中!

  20. _iLu_ 于 2010-11-17 13:02:58发表:

    新手摸索中!

  21. _iLu_ 于 2010-11-17 13:02:53发表:

    新手摸索中!

  22. _iLu_ 于 2010-11-17 13:02:50发表:

    新手摸索中!

  23. _iLu_ 于 2010-11-17 13:02:47发表:

    新手摸索中!

  24. gordenfl 于 2006-02-27 22:23:07发表:

    date --date='7 day ago' 就是7天以前的日期了啊,用不用这么麻烦啊
    :49ab:1