Difference between 2 dates

Hi Friends,

I have a file that has the contents like below:
file1.txt

5,13/07/2013 23:25:25,14/07/2013 19:40:21
5,13/07/2013 23:25:25,14/07/2013 19:40:43
5,12/07/2013 23:50:50,13/07/2013 20:30:26
5,12/07/2013 23:20:24,13/07/2013 19:40:53
60,14/07/2013 00:00:00,14/07/2013 23:00:39
60,14/07/2013 00:00:00,14/07/2013 23:00:36
60,14/07/2013 00:00:00,14/07/2013 23:00:47
t60,14/07/2013 01:00:00,15/07/2013 00:00:29
60,14/07/2013 00:00:04,14/07/2013 23:00:13
60,14/07/2013 00:00:34,14/07/2013 23:00:19

Now I need to find the difference between these 2 dates...for eg if I subtract date1=13/07/2013 23:55:55 and date2=14/07/2013 23:55:55..then the difference in minutes between these two dates is 1440..now I need to divide this number with the first field of the file.So the difference=date2-date1/60
I need to perform this operation for too many files.but the calculation is taking too much time.I am working on AIX. there is no mktime function available.How to optimize it.....

There are several questions like this.

http://www.unix.com/answers-frequently-asked-questions/13785-yesterdays-date-date-arithmetic.html

Thanks Joyeg...I had the script to calculate the difference but it is taking too much time..Let me explain you the logic that is being used by me:

for i in `cat calc_file_list.txt`
do
  echo "$i" >> newfile.txt
  while read line
  do
    sh timediffcalc.sh $line
  done<"$i"
done

where timediffcalc.sh is:

x="$2 $3"
y="$4 $5"
z="$1"
year1=`echo $x|cut -d- -f1`
month1=`echo $x|cut -d- -f2`
day1=`echo $x|cut -d- -f3|cut -d" " -f1`
lhr1=`echo $x|cut -d: -f1|cut -d" " -f2`
lmin1=`echo $x|cut -d: -f2`
lsec1=`echo $x|cut -d: -f3`
year2=`echo $y|cut -d- -f1`
month2=`echo $y|cut -d- -f2`
day2=`echo $y|cut -d- -f3|cut -d" " -f1`
lhr2=`echo $y|cut -d: -f1|cut -d" " -f2`
lmin2=`echo $y|cut -d: -f2`
lsec2=`echo $y|cut -d: -f3`

yr1=$(((year1 - 1970)*365.25*24*60*60))
mn1=$(((month1*30.5)*86400))
dy1=$(((day1-1)*86400))
hr1=$(((lhr1)*3600))
min1=$(((lmin1)*60))
secs1=$((yr1+mn1+dy1+hr1+min1+lsec1))
yr2=$(((year2 - 1970)*365.25*24*60*60))
mn2=$(((month2*30.5)*86400))
dy2=$(((day2-1)*86400))
hr2=$(((lhr2)*3600))
min2=$(((lmin2)*60))
secs2=$((yr2+mn2+dy2+hr2+min2+lsec2))

diffval=$((secs2-secs1))
difmin=$((diffval/60))
intervalobt=$((difmin/$z))

if [ "$intervalobt" -ge 700 ]; then
  echo $x,$y,$z,$intervalobt >> newfile.txt
fi

The file calc_file_list.txt is a list of files:

condition_1
condition_2
condition_3
condition_4

sample data for condition_1

5 2013-07-13 23:25:00 2013-07-14 19:40:00
5 2013-07-13 23:25:00 2013-07-14 19:40:00
5 2013-07-12 23:50:00 2013-07-13 20:30:00

But this logic is taking too much time and that is not desired...is there any way we can optimize it....

You may not have much option but a pure-Perl script.

In message #1 in this thread, you show a comma separated file with dates in day/month/year format. (And you have "t60" as a sample dividend.)

In message #3 in this thread, you show a space separated file with dates in year-month-day format.

Are these two different problems mixed into one thread? Is the program you want created for you supposed to handle both input formats? Are there other input formats?

Your use of 365.25 and 30.5 inside $((...)) imply that sh on your system is a 1993 or later version of the Korn shell. Assuming that is correct and that the calculations in the script you showed in message #3 are accurate enough for what you're trying to do, that script can be made MUCH faster by letting the shell perform the field splitting instead of using so many invocations of cut. Try replacing:

year1=`echo $x|cut -d- -f1`
month1=`echo $x|cut -d- -f2`
day1=`echo $x|cut -d- -f3|cut -d" " -f1`
lhr1=`echo $x|cut -d: -f1|cut -d" " -f2`
lmin1=`echo $x|cut -d: -f2`
lsec1=`echo $x|cut -d: -f3`
year2=`echo $y|cut -d- -f1`
month2=`echo $y|cut -d- -f2`
day2=`echo $y|cut -d- -f3|cut -d" " -f1`
lhr2=`echo $y|cut -d: -f1|cut -d" " -f2`
lmin2=`echo $y|cut -d: -f2`
lsec2=`echo $y|cut -d: -f3`

in timediffcalc.sh with:

OIFS="$IFS"
IFS=" -:"
set -- $2 $3 $4 $5
IFS="$OIFS"
year1=$1
month1=$2
day1=$3
lhr1=$4
lmin1=$5
lsec1=$6
year2=$7
month2=$8
day2=$9
lhr2=${10}
lmin2=${11}
lsec2=${12}
1 Like

Thanks Don Cragun..yes now the code is working fine with large data.