Существует решение, которое почти работает: используйте %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.)