views:

55

answers:

4

If there are dates as 2010-06-01 and another as 2010-05-15

Using shell script or date command how to get the number of days between the two dates

Thanks..

A: 

See here for an example, although it uses GNU date

ghostdog74
A: 

Got it

             d1=`date +%s -d $1`
             d2=`date +%s -d $2`
            ((diff_sec=d2-d1))
         echo - | awk -v SECS=$diff_sec '{printf "Number of days : %d",SECS/(60*60*24)}'

thanks..

Hulk
If you're going to use `(())` you might as well also use `$()` instead of backticks. Also, there's no need to pipe something into `awk`, just use `awk ... 'BEGIN {printf ...}'`. And you don't really need to use `awk` if it's just integer math: `echo "Number of days: $(( ( d2 - d1 ) / ( 60 * 60 * 24 ) ))"`
Dennis Williamson
Thanks.................
Hulk
+1  A: 

Using only date and shell arithmetics:

echo $(($(($(date -d "2010-06-01" "+%s") - $(date -d "2010-05-15" "+%s"))) / 86400))
smichak
It's not necessary to use `$(())` twice. Just use a set of grouping parentheses: `echo $(( ( $(date -d "2010-06-01" "+%s") - $(date -d "2010-05-15" "+%s") ) / 86400))` (optional spaces added for emphasis and readability)
Dennis Williamson
Note that `%s` is specific to GNU date, so it might not be available on non-Linux systems. The [comp.unix.shell FAQ](http://cfajohnson.com/shell/cus-faq.html#6) has a long discussion on date calculations (basically, it's hard unless you have GNU date).
Gilles
In fact there's a bigger problem: it sometimes fails in the spring… [My answer explains why.](http://stackoverflow.com/questions/3385003/shell-script-to-get-difference-in-two-dates/3391111#3391111)
Gilles
+2  A: 

There's a solution that almost works: use the %s date format of GNU date, which prints the number of seconds since 1970-01-01 00:00. These can be subtracted to find the time difference between two dates.

echo $(( ($(date -d 2010-06-01 +%s) - $(date -d 2010-05-15 +%s)) / 86400))

But the following displays 0 in some locations:

echo $((($(date -d 2010-03-29 +%s) - $(date -d 2010-03-28 +%s)) / 86400))

Because of daylight savings time, there are only 23 hours between those times. You need to add at least one hour (and at most 23) to be safe.

echo $((($(date -d 2010-03-29 +%s) - $(date -d 2010-03-28 +%s)) + 43200 / 86400))

Or you can tell date to work in a timezone without DST.

echo $((($(date -u -d 2010-03-29 +%s) - $(date -u -d 2010-03-28 +%s)) / 86400))

(POSIX says to call the reference timezone is UTC, but it also says not to count leap seconds, so the number of seconds in a day is always exactly 86400 in a GMT+xx timezone.)

Gilles