Chinaunix首页 | 论坛 | 博客
  • 博客访问: 209344
  • 博文数量: 27
  • 博客积分: 1000
  • 博客等级: 准尉
  • 技术积分: 264
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-01 10:45
文章分类

全部博文(27)

分类: 系统运维

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命令

#!/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
阅读(2272) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~