Как я могу получить разницу между двумя датами под Bash - PullRequest
17 голосов
/ 25 января 2012

Точно так же, как звучит вопрос. Я хочу вычесть, скажем, 20120115 из 20120203 и получить 19 в качестве ответа. Каков наилучший способ реализовать это в сценарии оболочки?

Ответы [ 3 ]

29 голосов
/ 25 января 2012
let DIFF=(`date +%s -d 20120203`-`date +%s -d 20120115`)/86400
echo $DIFF
0 голосов
/ 02 июля 2019

Как я решил это: (надеюсь, что это в конечном итоге содержит еще несколько полезных вещей)

current="$(date +%s.%N)" #current date precise to ns
old="$(date +%s.%N -d "$(sh some_script_that_gives_a_date.sh)")" #convert to seconds too
diff=$(echo "$current-$olc" |bc)

date +%s.%N -d $1 берет произвольную дату и преобразует ее в заданный формат.


Чтобы преобразовать его обратно в удобочитаемое человеком, вы можете использовать
date $2 -d @0$diff #Pad diff with leading zero

Где $ 2 - формат даты, см. https://www.tutorialkart.com/bash-shell-scripting/bash-date-format-options-examples/

0 голосов
/ 18 ноября 2016

Быстрое и очень грязное исправление, которое можно использовать в скриптах (быстрое и быстрое):

Эта функция gendates создает список допустимых дат между двумя датами в формате ГГГГммдд (самый старый первый).

function gendates { for dd in $(seq -w $1 $2) ; do date -d $dd +%Y%m%d 2>/dev/null ; done  ; }                                                                             

Я использую эту функцию для нескольких целей, связанных с файлами журналов, например, для генерации списка имен файлов журналов для проверки [1]. И это удобно для подсчета разницы в днях:

echo "$(gendates YYYYmmdd YYYYmmdd)" | wc -l

ГГГГммдд, конечно, должны быть даты. Он работает только в том случае, если 1 долл. Является более ранней датой, чем 2 долл., И медленен при больших различиях в датах, но в течение нескольких лет и для использования в специальных сценариях это довольно удобно.

И если у вас установлен MySQl или аналогичный, есть очень быстрый вариант:

mysql -BNe "SELECT DATEDIFF($1,$2) AS DiffDate ;" | tr -d -

Последний tr позволяет вам вводить даты в любом порядке (MySQL иначе выдает '-', если первая дата раньше, чем вторая)

[1] Причиной создания списка дат является то, что с его помощью я могу сгенерировать имена файлов журналов в следующем формате: YYYYmmdd.log.gz. Я мог бы сделать это, используя звездочку или $ (ls), но это намного медленнее, чем просто предоставление списка со строками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...