#!/bin/ksh
#####
# days preceding a month for standard and leap year
mos[1]=0 mol[1]=0
mos[2]=31 mol[2]=31
mos[3]=59 mol[3]=60
mos[4]=90 mol[4]=91
mos[5]=120 mol[5]=121
mos[6]=151 mol[6]=152
mos[7]=181 mol[7]=182
mos[8]=212 mol[8]=213
mos[9]=243 mol[9]=244
mos[10]=273 mol[10]=274
mos[11]=304 mol[11]=305
mos[12]=334 mol[12]=335
# seconds in a year, leapyear and day
((secy=365*24*60*60))
((secl=366*24*60*60))
((secd=24*60*60))
# maybe the epoch year needs to be lowered further on
epoch=2000
# your vars
var1="20061010 12:15:35"
var2="20061011 1:15:32"
# print out origina vars
echo $var1
echo $var2
# canonicalize dates
echo $var1|awk '{split($2,tm,":");
print substr($1,1,4),substr($1,5,2),substr($1,7,2),
tm[1], tm[2], tm[3]}'|read yr1 mo1 dy1 hr1 mi1 sc1
echo $var2|awk '{split($2,tm,":");
print substr($1,1,4),substr($1,5,2),substr($1,7,2),
tm[1], tm[2], tm[3]}'|read yr2 mo2 dy2 hr2 mi2 sc2
# print out canonicalized vars
echo $yr1 $mo1 $dy1 $hr1 $mi1 $sc1
echo $yr2 $mo2 $dy2 $hr2 $mi2 $sc2
# shell function to check for leap year
leapyear()
{
((l=1))
((r4=$1%4))
((r100=$1%100))
((r400=$1%400))
if ((r4==0))
then
if ((r100!=0))
then
((l=0))
else
if ((r400==0))
then
((l=0))
fi
fi
fi
return $l
}
# calculate julian dates
if leapyear $yr1
then
((ju1=${mol[mo1]}+dy1))
else
((ju1=${mos[mo1]}+dy1))
fi
if leapyear $yr2
then
((ju2=${mol[mo2]}+dy2))
else
((ju2=${mos[mo2]}+dy2))
fi
# convert time to seconds
((se1=hr1*3600+mi1*60+sc1))
((se2=hr2*3600+mi2*60+sc2))
# print out julian date and seconds
echo $yr1.$ju1.$se1
echo $yr2.$ju2.$se2
# possibly first lower the epoch year
while ((epoch>yr1))
do
((epoch=epoch-1))
done
while ((epoch>yr2))
do
((epoch=epoch-1))
done
# print out epoch
echo $epoch
# convert year and julian dates to seconds
((yr=epoch))
while ((yr<yr1))
do
if leapyear $yr
then
((se1=se1+secl))
else
((se1=se1+secy))
fi
((yr=yr+1))
done
((se1=se1+ju1*secd))
((yr=epoch))
while ((yr<yr2))
do
if leapyear $yr
then
((se2=se2+secl))
else
((se2=se2+secy))
fi
((yr=yr+1))
done
((se2=se2+ju2*secd))
# print out date/time converted to seconds since epoch
echo $se1
echo $se2
# calculate difference in seconds
((ds=se2-se1))
# print out difference in dates in seconds
echo $ds