#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