aaa=`cal $mm $yy`
bbb=`echo $aaa|awk '{print $NF}'`
其實感覺用上面兩句取某月有多少天在計算日期中非常有用
俺也是吸取前人的經驗靈活應用一下.
有些是以前的,有些沒有判斷輸入合法性,有問題請指正
#計算某日前若干天的日期
#date=YYYYMMDD
#Usage:command date days
str=$1
days=$2
yy=`echo $str|cut -c 1-4`
mm=`echo $str|cut -c 5-6`
dd=`echo $str|cut -c 7-8`
sav_dd=$days
days=`expr $days - $dd`
while [ $days -ge 0 ]
do
mm=`expr $mm - 1`
[ $mm -eq 0 ] && mm=12 && yy=`expr $yy - 1`
aaa=`cal $mm $yy`
bbb=`echo $aaa|awk '{print $NF}'`
days=`expr $days - $bbb`
done
dd=`expr 0 - $days`
expr $dd : "^.$" > /dev/null && dd=0$dd
expr $mm : "^.$" > /dev/null && mm=0$mm
echo $yy$mm$dd
#計算某日後若干天日期(這個不對,下面有對的)
#date=YYYYMMDD
#Usage:command date days
str=$1
days=$2
yy=`echo $str|cut -c 1-4`
mm=`echo $str|cut -c 5-6`
dd=`echo $str|cut -c 7-8`
days=`expr $days + $dd`
while [ $days -gt 0 ]
do
aaa=`cal $mm $yy`
bbb=`echo $aaa|awk '{print $NF}'`
sav_dd=$days
sav_mm=$mm
sav_yy=$yy
days=`expr $days - $bbb`
mm=`expr $mm + 1`
[ $mm -gt 12 ] && mm=1 && yy=`expr $yy + 1`
done
expr $sav_dd : "^.$" > /dev/null && sav_dd=0$sav_dd
expr $sav_mm : "^.$" > /dev/null && sav_mm=0$sav_mm
echo $yy$sav_mm$sav_dd
~
感覺上面兩個挺實用的
#計算前一天日期
aaa=`echo $TZ|sed 's/.*\(..\)/\1/'`
aaa=`expr $aaa + 24`
eval aaa=`echo $TZ|sed 's/..$/+$aaa/'`
TZ=$aaa
export TZ
yy=`date +%y`
mm=`date +%m`
dd=`date +%d`
echo $mm$dd$yy
可以調用上面的函數推導出.
#取上月末日期
get_lastday_of_lastmonth()
{
yy=`date +%Y`
mm=`date +%m-1|bc`
[ $mm -lt 1 ] && mm=12;yy=`expr $yy - 1`
aaa=`cal $mm $yy`
dd=`echo $aaa|awk '{print $NF}'`
echo $yy$mm$dd
}
~
#計算兩個日期間有多少天
#date1,date2:yyyymmdd
#Usage:command date1 date2
str=$1
yy1=`echo $str|cut -c 1-4`
mm1=`echo $str|cut -c 5-6`
dd1=`echo $str|cut -c 7-8`
str=$2
yy2=`echo $str|cut -c 1-4`
mm2=`echo $str|cut -c 5-6`
dd2=`echo $str|cut -c 7-8`
count_day=`expr $dd2 - $dd1`
while [ $yy2 -ne $yy1 -o $mm2 -ne $mm1 ]
do
mm2=`expr $mm2 - 1`
[ $mm2 -eq 0 ] && mm2=12 && yy2=`expr $yy2 - 1`
aaa=`cal $mm2 $yy2`
bbb=`echo $aaa|awk '{print $NF}'`
count_day=`expr $count_day + $bbb`
done
echo $count_day
"計算某日後若干天日期"好象是有點問題,當月份為12月時會出錯,我想可能就是因為沒有去判斷這個月是幾天,然後看是否“-gt”那個天數。
哪怕是算12月1日的後一天,mm也會加1。
---------------------------------
感謝,偶出新大意拉.應該這樣
#計算某日後若干天日期
#date=YYYYMMDD
#Usage:command date days
str=$1
days=$2
yy=`echo $str|cut -c 1-4`
mm=`echo $str|cut -c 5-6`
dd=`echo $str|cut -c 7-8`
days=`expr $days + $dd`
while [ $days -gt 0 ]
do
aaa=`cal $mm $yy`
bbb=`echo $aaa|awk '{print $NF}'`
sav_dd=$days
sav_mm=$mm
sav_yy=$yy
days=`expr $days - $bbb`
mm=`expr $mm + 1`
[ $mm -gt 12 ] && mm=1 && yy=`expr $yy + 1`
done
expr $sav_dd : "^.$" > /dev/null && sav_dd=0$sav_dd
expr $sav_mm : "^.$" > /dev/null && sav_mm=0$sav_mm
echo $sav_yy$sav_mm$sav_dd
--------------------------------------------------------最簡單的。。。
版主---
不如用date
#!/bin/bash
#計算010101 5日後
date -d "010101 5 days" "+%Y%m%d"
#計算010101 5日前
date -d "010101 5 days ago" "+%Y%m%d"
#計算前一天
date -d "last day" "+%Y%m%d"
#計算上個月末
date -d "$(date '+%Y%m01') 1 days ago" "+%Y%m%d"
#計算兩個日期間有多少天數
echo $(($(($(date -d "020202" "+%s")-$(date -d "010101" "+%s")))/$((60*60*24))))
就是最後一個有點麻煩!
-----------------------------------------------------
回復 #41 yunzhongyue 的帖子
這樣也可以實現, 也是借助date命令
#!/bin/sh
day=$1
interval=`expr $2 \* 60 \* 60 \* 24`
daysec=`date -d $day +%s`
resultsec=`expr $daysec + $interval`
result=`date -d "1970-01-01 UTC $resultsec sec" +%Y%m%d`
echo "result: $result"
運行結果:
#./getDateByInterval.sh 20080101 7
result: 20080108
# ./getDateByInterval.sh 20080101 -7
result: 20071225