Определение длительности между датами - PullRequest
0 голосов
/ 18 февраля 2012

Я все еще довольно новичок в программировании на BASH, и я ломаю голову над проблемой.Я пытаюсь написать скрипт для своей работы, который бы облегчил подсчет возврата за отмененный пакет до его обычной даты окончания.Теперь о простых вещах, таких как входные данные и другие подобные вещи, я уверен, что смогу разобраться с поиском в Google и экспериментами (хотя, если вы решите помочь с этим, я был бы очень признателен).

В чем я не уверенЯ мог бы найти, как сделать сам по себе сценарий или набор команд, которые могли бы рассчитать количество дней / месяцев между двумя датами и использовать эту переменную для расчета общей суммы возмещения.Я попытаюсь объяснить, что я пытаюсь сделать здесь:

Введите две даты (в формате ММ / ДД / ГГГГ) и получите разницу в месяцах и днях, т.е. 3 месяца 13 дней.

Входная базовая месячная ставка

(База * Количество месяцев) + ((база / 30) * Количество дней) = Количество использованных клиентов

Введите сумму, которую заплатил клиент - Использованная сумма =Сумма, подлежащая возмещению

Затем, предпочтительно, она печатается так, чтобы можно было «показать свою работу»

Я знаю, что это немного, чтобы просить о помощи, но я действительно могиспользуйте руку с калькулятором даты.

Спасибо за любую помощь заранее!

PS Я заранее провел небольшой поиск и нашел вопросы ПОХОЖИЕ на это, но ничего, что действительно подходило бы именно к тому, чтоМне нужно.

Ответы [ 4 ]

2 голосов
/ 11 апреля 2012

Используя мои dateutils , вы можете перейти на

ddiff '2010-12-05' '2012-04-10' -f '%mmo %dd'
=>
  16mo 5d
0 голосов
/ 18 февраля 2012

Если вы не хотите, чтобы days было больше 30, это будет работать в bash:

date1="12/20/2011"
date2="02/18/2012"

y1=${date1/*\/*\//}
y2=${date2/*\/*\//}

m1=${date1/\/*\/*/}
m2=${date2/\/*\/*/}

d1=${date1/\/$y1/}
d1=${d1/$m1\//}
d2=${date2/\/$y2/}
d2=${d2/$m2\//}

m=$(( $y2 * 12 - $y1 * 12 + $m2 - $m1 ))
d=$(( $d2 - $d1 ))
test $d -lt 0 && { d=$(( $d + 30 )); m=$(( $m - 1 )); }

echo "$m month(s) and $d day(s)."

Синтаксический анализ даты может быть упрощен следующим образом, если у вас всегда есть 2 символа для DD и MM:

y1=${date1:6:4}
y2=${date2:6:4}

m1=${date1:0:2}
m2=${date2:0:2}

d1=${date1:3:2}
d2=${date2:3:2}
0 голосов
/ 18 февраля 2012

Используя awk, вы можете:

date1="12/20/2011"
date2="02/19/2012"
echo -e "$date1\n$date2" | awk -F "/" -v base=15 '
  NR == 1 {m1=$1; d1=$2; y1=$3}
  NR == 2 {m2=$1; d2=$2; y2=$3}
  END{m=12*(y2-y1) + m2-m1; d=d2-d1; m=d<0 ? m-1 : m; d=d<0 ? d+30 : d
    print m " month(s) and " d " day(s)"
    print "refund: " (base*m + (base/30.0)*d) "€"}'
0 голосов
/ 18 февраля 2012

В python вы можете использовать datetime.strptime() метод из datetime модуля:

$ from=01/25/2011 to=01/30/2012
$ dur=`python -c "from datetime import datetime; print((datetime.strptime('$to', '%m/%d/%Y')-datetime.strptime('$from', '%m/%d/%Y')).days)"`
$ echo $dur
370
...