2012-01-25 2 views
12

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

+0

Возможная дубликат проверка на этот вопрос: http://stackoverflow.com/questions/4946785/how-to-find-difference-days-between-to-dates –

+0

Вы рассмотрели другой язык сценариев, который поддерживает даты по своей сути? (python, ruby, perl, ... в определенном порядке). Также вы можете использовать скрипт onliner в источнике bash. – schoetbi

+0

@schoetbi Я подумал об этом, но не был уверен в этой доступности во всем мире. Я знаю, что базовый баш и дата доступны во всех точках интереса, но не о остальных. – owagh

ответ

24
let DIFF=(`date +%s -d 20120203`-`date +%s -d 20120115`)/86400 
echo $DIFF 
+0

Как дата признана, что строка находится в формате YYYYMMDD? Пожалуйста, направляйте меня в документацию. –

+0

man 1 date говорит: «The -date = STRING - это в основном свободная форма строки для чтения человеком» –

+0

Что делать, если строка 03022012? Обратите внимание, что я изменил формат на DDMMYYYY. –

0

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

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

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

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

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

И если вам случится иметь MySql или подобный установленный там очень быстрый вариант:

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

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

Смежные вопросы