Найти количество дней из двух дат с помощью shell

#linux #shell

#linux #оболочка

Вопрос:

Я хотел бы найти количество дней с двух заданных дат, таких как 25 августа 2017 года и 05 сентября 2017 года.

Мой скрипт:

 start='2017-08-25';
end='2017-09-05';
ndays=(strtotime($end)- strtotime($start))/24/3600;
echo $ndays
  

При запуске этого скрипта я получаю следующие сообщения об ошибках.

 Line 3: syntax error near unexpected token `('
  

Желаемое выходное значение:

 10
  

Комментарии:

1. Разве не следует выводить 11 вместо 10?

2. Это зависит от часов. В моем случае это начинается с 00 Hours of 25 Aug 2017 до 00 Hours of 05 Sep 2017

Ответ №1:

Ни в одной известной мне оболочке нет инструментов для работы с датами. По крайней мере, вам нужен внешний инструмент, такой как date , для преобразования ваших дат в промежуточную форму, например, количество секунд с некоторого фиксированного момента времени (в Unix используется 1 января 1970 года), затем выполните вычисления с этими значениями, прежде чем обрабатывать результат дальше.

Предполагая использование GNU date из тега Linux, вы бы сделали что-то вроде

 start='2017-08-25'
end='2017-09-05'

start_seconds=$(date  %s --date "$start" --utc)
end_seconds=$(date  %s --date "$end" --utc)

ndays=$(( (end_seconds - start_seconds) / 24 / 3600 ));
echo $ndays
  

Обратите внимание, что, поскольку большинство оболочек поддерживают только целочисленную арифметику, это не даст вам точного количества дней.

Комментарии:

1. Добавлена --utc опция, чтобы, когда start=2019-03-09 end=2019-03-11 результат равен 2 дням.

Ответ №2:

Вы можете использовать date для преобразования каждой даты в секунды эпохи, затем использовать арифметическое расширение для вычитания и обратного преобразования в дни:

 #! /bin/bash
start='2017-08-25';
end='2017-09-05';

diff=$(date -d $end  %s)-$(date -d $start  %s)
echo $(( ($diff) / 60 / 60 / 24 ))  # 11