分类: 系统运维
2015-04-04 09:17:34
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命令