Hulk
Hulk

Reputation: 34200

How to get the difference in days between two dates using shell commands?

Using shell commands or the date command, how do I get the number of days between two dates?
e.g., 2010-06-01 - 2010-05-15

Upvotes: 15

Views: 76704

Answers (5)

smichak
smichak

Reputation: 4958

Using only date and shell arithmetics:

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

Upvotes: 24

Niko Ruotsalainen
Niko Ruotsalainen

Reputation: 53882

OSX date is different than GNU date. Got it working like this in OSX. This is not portable solution.

start_date=$(date -j -f "%Y-%m-%d" "2010-05-15" "+%s")
end_date=$(date -j -f "%Y-%m-%d" "2010-06-01" "+%s")

echo $(( ($end_date - $start_date) / (60 * 60 * 24) ))

Idea is still same as in the other answers. Convert dates to epoch time, subtract and convert result to days.

Upvotes: 6

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.)

Upvotes: 15

user unknown
user unknown

Reputation: 36269

Gnu date knows %j to display the day in year:

echo $(($(date -d 2010-06-01 +%j) - $(date -d 2010-05-15 +%j)))

crossing year-boundaries will give wrong results, but since you gave fixed dates ...

Upvotes: 0

Hulk
Hulk

Reputation: 34200

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..

Upvotes: 1

Related Questions