Ответ 1
Использование только арифметики даты и оболочки:
echo $(($(($(date -d "2010-06-01" "+%s") - $(date -d "2010-05-15" "+%s"))) / 86400))
Если есть даты как 2010-06-01, а еще как 2010-05-15
Использование оболочки script или команды даты, как получить количество дней между двумя датами
Спасибо..
Использование только арифметики даты и оболочки:
echo $(($(($(date -d "2010-06-01" "+%s") - $(date -d "2010-05-15" "+%s"))) / 86400))
Есть решение, которое почти работает: используйте формат даты %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.)
Получил его
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)}'
спасибо..
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) ))
Идея по-прежнему такая же, как и в других ответах. Преобразовать даты в эпоху, вычесть и преобразовать результат в дни.
Дата gnu знает% j для отображения дня в году:
echo $(($(date -d 2010-06-01 +%j) - $(date -d 2010-05-15 +%j)))
пересечение границ года даст неправильные результаты, но так как вы дали фиксированные даты...