一个求日期差的shell脚本

rongstar 2007-03-19 02:42:01
今天为项目写了一个清理N天前日志的一个脚本,其实处理过程是很简单的,但是没想到在处理时间细节上竟用了这么长的代码,以下代码完成了输入前后两个日期(第一个日期大于第二个日期)后得出这两个日期之间天数的结果。
写完后感觉这个代码好长好笨啊,请大家指正。
如果大家用的上,在这里就给大家共享了。
#! /bin/sh
leapy()
{
year=$1
RET="false"
fhundred=`expr $year % 400`
ohundred=`expr $year % 100`
four=`expr $year % 4`
if [ $fhundred -eq 0 ]
then
RET="true"
fi
if [ \( $four -eq 0 \) -a \( $ohundred -ne 0 \) ]
then
RET="true"
fi
echo $RET
#return $RET
}
dealy()
{
year1=$1
year2=$2
ycount=`expr $year1 - $year2`
#ycount=$1
count=1
nday=0
if [ $ycount -lt 0 ]
then
echo "The order of year's number is Error!"
exit 1
fi
while [ $count -lt $ycount ]
do
year=`expr $year2 + $count`
leapyear=`leapy $year`
if $leapyear
then
nday=`expr $nday + 1`
fi
count=`expr $count + 1`
done
days=`expr $ycount \* 365 + $nday`
echo $days
#return $days
}
dealm()
{
month=$1
year=$2
if [ \( $month -le 7 \) -a \( $month -ge 0 \) ]
then
days=`expr $month / 2 \* 30 + \( $month - $month / 2 \) \* 31`
elif [ \( $month -ge 8 \) -a \( $month -le 12 \) ]
then
days=`expr $month / 2 \* 31 + \( $month - $month / 2 \) \* 30`
else
echo "The mistaking of month"
exit 1
fi
leapyear=`leapy $year`
if $leapyear
then
days=`expr $days - 1`
else
days=`expr $days - 2`
fi
echo $days
#return $days
}
countdate()
{
if [ $# -ne 2 ]
then
echo "Usage: countdate <yyyymmdd> <yyyymmdd>"
exit 1
fi
date1=$1
date2=$2
lend1=`expr length $date1`
lend2=`expr length $date2`
if [ $lend1 -ne 8 -o $lend2 -ne 8 ]
then
echo "The date format of input is not right!"
echo "Usage: countdate <yyyymmdd> <yyyymmdd>"
exit 1
fi
year1=`expr substr $date1 1 4`
year2=`expr substr $date2 1 4`
month1=`expr substr $date1 5 2`
month1=`echo $month1|sed -e 's/^0//'`
month1=`expr $month1 - 1`
month2=`expr substr $date2 5 2`
month2=`echo $month2|sed -e 's/^0//'`
month2=`expr $month2 - 1`
day1=`expr substr $date1 7 2`
day1=`echo $day1|sed -e 's/^0//'`
day2=`expr substr $date2 7 2`
day2=`echo $day2|sed -e 's/^0//'`
yearsub=`expr $year1 - $year2`
if [ $yearsub -ge 0 ]
then
#ydays=`dealy $yearsub`
ydays=`dealy $year1 $year2`
else
echo "The date order is Error!"
exit 1
fi
mdays1=`dealm $month1 $year1`
mdays2=`dealm $month2 $year2`
days1=`expr $ydays + $mdays1 + $day1`
days2=`expr $mdays2 + $day2`
days=`expr $days1 - $days2`
echo $days
#return $days
}
result=`countdate $1 $2`
echo $result
...全文
553 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
rongstar 2007-03-22
  • 打赏
  • 举报
回复
说可以用C实现的那位兄弟,能指教一下吗?
rongstar 2007-03-21
  • 打赏
  • 举报
回复
惭愧,我对C库函数不熟悉,能告诉我是哪一个哭的哪一个函数吗?不知道你说的是UNIX/Linux下的C还是 ANSI C?
cime63 2007-03-21
  • 打赏
  • 举报
回复
做个记号
昨天刚学到shell
lovecissi 2007-03-20
  • 打赏
  • 举报
回复
C好像有现成的吧,为啥还要要SHELL来实现呢?
rongstar 2007-03-20
  • 打赏
  • 举报
回复
这段程序需要在UNIX/Linux环境下运行,Linux下的date命令功能比UNIX多,在Linux你的方法很好,这么简洁,谢谢指教
gangjh 2007-03-19
  • 打赏
  • 举报
回复
的確很複雜,用linux這樣算可能要簡單些

D1=`date --date='20070409' +"%s"`

D2=`date --date='20070304' +"%s" `

D3=$(($D1 - $D2))

echo $(($D3/60/60/24))

23,118

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧