Сценарий оболочки, чтобы получить разницу в две даты - PullRequest
14 голосов
/ 02 августа 2010

Если есть даты как 2010-06-01, а другая как 2010-05-15

Используя сценарий оболочки или команду даты, как получить количество дней между двумя датами

Спасибо ..

Ответы [ 5 ]

16 голосов
/ 02 августа 2010

Использование только даты и арифметики оболочки:

echo $(($(($(date -d "2010-06-01" "+%s") - $(date -d "2010-05-15" "+%s"))) / 86400))
10 голосов
/ 02 августа 2010

Существует решение, которое почти работает: используйте %s формат даты даты GNU, который печатает количество секунд с 1970-01-01 00:00. Их можно вычесть, чтобы найти разницу во времени между двумя датами.

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

Но в некоторых местах отображается 0:

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

Из-за перехода на летнее время между этими часами только 23 часа. Вы должны добавить как минимум один час (и максимум 23), чтобы быть в безопасности.

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

Или вы можете указать date работать в часовом поясе без DST.

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

(POSIX говорит, что для вызова эталонного часового пояса используется UTC, но он также не учитывает високосных секунд, поэтому количество секунд в дне всегда точно равно 86400 в часовом поясе GMT ​​+ xx.)

1 голос
/ 01 апреля 2017

OSX date отличается от GNU date.Получилось так работать в OSX.Это не переносимое решение.

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

Идея все та же, что и в других ответах.Преобразование даты в время эпохи, вычитание и преобразование результата в дни.

1 голос
/ 02 августа 2010

Понял

             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)}'

спасибо ..

0 голосов
/ 14 апреля 2011

Gnu date знает% j для отображения дня в году:

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

пересечение границ года даст неверные результаты, но поскольку вы указали фиксированные даты ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...