ChinaUnix.net
 >> ChinaUnix.net > Shell

shell 计算明天和昨天日期的函数

作者:hwhcom     发表时间:2002/07/05 02:29pm

#返回月份的天数
get_mon_days()
{
       Y=`expr substr $1 1 4`
       M=`expr substr $1 5 2`

       r1=`expr $Y \% 4`
       r2=`expr $Y \% 100`
       r3=`expr $Y \% 400`

       case $M in
       01|03|05|07|08|10|12) days=31;;
       04|06|09|11) days=30;;
       esac
       if [ $M -eq 02 ]
       then
               if [ r1 -eq 0 -a r2 -ne 0 -o r3 -eq 0 ]
               then
                       days=29
               else
                       days=28
               fi
       fi
       echo $days
}
#返回昨天日期
get_before_date()
{
Y=`expr substr $1 1 4`
M=`expr substr $1 5 2`
D=`expr substr $1 7 2`
YY=`expr $Y - 1`
MM=`expr $M - 1`
DD=`expr $D - 1`
MM=`printf "%02d" $MM`
DD=`printf "%02d" $DD`
dd=$Y$MM
dad=`get_mon_days $dd`
be_date=$Y$M$DD
if [ $D -eq 01 ]
then
if [ $M -ne 01 ]
then
be_date=$Y$MM$dad
fi
if [ $M -eq 01 ]
               then
                       be_date=$YY"1231"
               fi
  fi
       echo $be_date

}
#返回明天日期
get_next_date()
{
Y=`expr substr $1 1 4`
M=`expr substr $1 5 2`
D=`expr substr $1 7 2`
YY=`expr $Y + 1`
MM=`expr $M + 1`
DD=`expr $D + 1`
MM=`printf "%02d" $MM`
DD=`printf "%02d" $DD`
r1=`expr $Y \% 4`
r2=`expr $Y \% 100`
r3=`expr $Y \% 400`

       next_date=$Y$M$DD

       if [ $D -eq 30 ]
       then
               case $M in
               04|06|09|11) next_date=$Y$MM"01";;
               esac
       fi
       if [ $D -eq 31 ]
       then
               next_date=$Y$MM"01"
               case $M in
               12) next_date=$YY"0101";;
               esac
       fi
       if [ $M -eq 02 ]
       then
               if [ r1 -eq 0 -a r2 -ne 0 -o r3 -eq 0 ]
               then
                       if [ $D -eq 29 ]
                       then
                               next_date=$Y$MM"01"
                       fi
               else
                       if [ $D -eq 28 ]
                       then
                               next_date=$Y$MM"01"
                       fi
               fi
       fi
       echo $next_date
}

本人在HP Unix下测试通过


此文章相关评论:
该文章有20个相关评论如下:(点这儿可以发表评论)
valentine 发表于: 2002/07/05 05:45pm
不错.
不过,用改变时区的方法,得到的结果不是又简单,又准确吗?
 
wyjs 发表于: 2002/07/05 11:58pm
版主时区变换法是什么?
 
valentine 发表于: 2002/07/08 09:40am
比如说,想这样:
offset=`echo $TZ | tr -d '[A-Z+]'`
new_offset=`expr $offset - 24 `
TZ=`echo $TZ | sed "s/[+-]\{0,1\}[1-9][0-9]\{0,1\}/$new_offset/` \
  date +%D
 
hwhcom 发表于: 2002/07/08 09:46am
thanks  valentine
又学到新东西
 
valentine 发表于: 2002/07/08 10:33am
you are welcome,hwhcom.
欢迎多交流.
 
nortell 发表于: 2002/07/17 12:20pm
请问能不能解释一下这三句话的含义呀?
我第二句执行不过!

多谢!

 
valentine 发表于: 2002/07/18 08:32am
第二句是`不是',是不是输错了.
 
nortell 发表于: 2002/07/19 11:07am
我是copy, paste 上的!

root/export >offset=`echo $TZ | tr -d '[A-Z+]'`
root/export >echo $offset
GMT8
root/export >new_offset=`expr $offset - 24 `
expr: non-numeric argument

 
valentine 发表于: 2002/07/19 11:23am
tr -d '[A-Z+] offset 里怎么还会有GMT呢?
有GMT expr当然不认了.
 
nortell 发表于: 2002/07/19 11:38am
是呀!
第一句有什么问题呀????
 
valentine 发表于: 2002/07/19 11:44am
你是什么系统啊,什么版本的tr啊.
俺都试过的啊.
 
哈密瓜 发表于: 2002/07/22 03:43pm
valentine,能不能解释一下这几句,3x!
 
valentine 发表于: 2002/07/22 05:06pm
#offset=`echo $TZ | tr -d '[A-Z+]'`
#使用tr删除变量中的大写字符和+号,只保留数字

new_offset=`expr $offset - 24 `
#改变数字,因为TZ变量中的数字反映的是本地相对与GMT的偏移

TZ=`echo $TZ | sed "s/[+-]\{0,1\}[1-9][0-9]\{0,1\}/$new_offset/` \
 date +%D
#使用算出来的偏移构造新的TZ变量,这里使用了正则表达式里稍复杂点的东西
#主要是\{0,1\},表示前面的字符或子表达式出现的次数最小0次,最多1次.

 
eagle 发表于: 2002/07/25 10:27am
为什么我的$TZ只是大写字符,没有数值?
 
eagle 发表于: 2002/07/25 10:33am
我用的是s8操作系统
 
琼思 发表于: 2002/10/11 10:20am
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=11&topic=992&show=0
这样是不是更简单
 
山地獾 发表于: 2002/10/11 10:53am
[quote][b]下面引用由[u]琼思[/u]在 [i]2002/10/11 10:20am[/i] 发表的内容:[/b]
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=11&topic=992&show=0
这样是不是更简单
[/quote]
那样作法是不对的:20020930+1=? 20021001-1=?
 
goodboy 发表于: 2002/10/14 03:39pm
#echo $TZ
CST-8
换一部机器:
#echo $TZ
EST5EDT
奇怪!
 
jazy 发表于: 2002/10/14 06:58pm
有什么奇怪的,那两台机子的时区不一样啊!
 
unixkiller 发表于: 2002/10/15 05:47pm
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=11&topic=164&show=0
 
 

Copyright © ChinaUnix.net  *  转载请注明出处及作者