Shell script to get difference in two dates

2019-04-19 03:00发布

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

标签: shell date
5条回答
仙女界的扛把子
2楼-- · 2019-04-19 03:16

Using only date and shell arithmetics:

echo $(($(($(date -d "2010-06-01" "+%s") - $(date -d "2010-05-15" "+%s"))) / 86400))
查看更多
趁早两清
3楼-- · 2019-04-19 03:24

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

查看更多
Deceive 欺骗
4楼-- · 2019-04-19 03:28

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.

查看更多
干净又极端
5楼-- · 2019-04-19 03:29

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

查看更多
We Are One
6楼-- · 2019-04-19 03:30

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

查看更多
登录 后发表回答