LINUX.ORG.RU

Получение разницы между датами bash

 ,


0

3

Проблема по мотивам архивного сообщения Получение разницы между датами

Необходимо получить разницу в количестве месяцев между двумя датами вида dd/mm/yyyy

current_date=`date +%d/%m/%Y`

before_date=«01/01/1980»

SDIFF=$((`date -d «$current_date» '+%s'` - `date -d «$before_date» '+%s'`))

echo $SDIFF

Собственно проблема что date никак не воспринимает формат dd/mm/yyyy и ругается «date: неверная дата «31/12/2015»» Аналогичная ошибка у меня и в примере, которое приведено в том архивном сообщении, которое якобы работало в далеком 2007 году.

Система РедХат 6

date +%d/%m/%Y

date +%m/%d/%Y

Вопросы?

anonymous ()

В man date есть пример с датой в том формате, в котором оно понимает: «2004-02-29 16:21:42».

И приведенный пример считает разницу в секундах, а не в месяцах.

А в месяцах можно считать двояко. Можно в секундах, затем делить на 30 дней:

$ echo $(( ( $(date +%s --date="1981-01-01") - $(date +%s --date="1980-01-01") ) / (60*60*24*30) ))
12

Но, ИМХО, так не совсем правильно. Особенно ошибка будет заметна на больших диапазонах.
Я бы отдельно считал разницу в годах, отдельно в месяцах:
$ echo $(( $(date +%m --date="1981-01-01") - $(date +%m --date="1980-01-01") + ( $(date +%Y --date="1981-01-01") - $(date +%Y --date="1980-01-01") ) * 12 ))
12

Kroz ★★★★★ ()
Последнее исправление: Kroz (всего исправлений: 1)

Переводить в Epoch, разность делить до нужной точности.

Bfgeshka ★★★★★ ()

А зачем вообще все эти date и прочие сложности? Количество месяцев в любом году же, вроде бы, постоянно, не?

Zmicier ★★★★★ ()

Необходимо получить разницу в количестве месяцев между двумя датами вида dd/mm/yyyy

А скорость получения важна? :-)

Deathstalker ★★★★★ ()
Ответ на: комментарий от Zmicier

Ну, в смысле:

$ past_date='01/01/1980'
$ IFS='/' read __ past_month past_year <<< "$past_date"
$ (( past_month_ad = 12 * past_year + past_month ))
$ printf -v current_month '%(%m)T\n'
$ printf -v current_year '%(%Y)T\n'
$ (( current_month_ad = 12 * current_year + current_month ))
$ echo $(( current_month_ad - past_month_ad ))
431

Или я задачу не понял? Судя по тому, как тут все ее серьезно обсуждают, это весьма возможно.

Zmicier ★★★★★ ()
Последнее исправление: Zmicier (всего исправлений: 1)

bash -c «python -c \„import datetime;...\“»

anonymous ()
Ответ на: комментарий от Zmicier

Глобальная задача проверять срок действия сертификата эцп, хранимого на токене :-) срок когда начал действовать сертификат вытянул в виде дата/время из поля Not valid before: Зная, что срок действия сертификата эцп по российскому законодательству 1 год и 3 месяца, или 15 месяцев говоря другими словами, просто проверяю

Если (текущая дата - дата сертификата из токена > 14 месяцев) то слать емыл админу что в сервере hostname срок действия сертификата, через месяц закончится. иначе Если (текущая дата - дата сертификата из токена > 15 месяцев) то слать емыл админу что в сервере hostname срок действия сертификата уж кончился.

Скрипт засовывается в крон, и раз в день исполняется. Цель всего, заблаговременно понять что сертификат скоро кончится и нужно его перевыпустить.

Собственно весь код «скрипта» готов, только последняя часть расчета разницы в датах всё застопорило. Предполагал что «date -d» можно передать дату/время в нужном мне формате (dd/mm/yyyy), а оказывается оно понимает только один определенный вид указанный в man. Решение задачи будет приведение даты в тот вид который надо команде date, точность расчета +/- день роли особой не играет.

karasic ()
Ответ на: комментарий от karasic

Ну да, как я сказал выше, date(1) вам здесь не нужен вовсе.

Zmicier ★★★★★ ()
Последнее исправление: Zmicier (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.