Сначала вам нужно преобразовать даты в формат unix time _t (т.е. секунды с "эпохи", 1970 -01 -01 00 :00 :00 ). Затем вы можете вычислить разницу с помощью простого вычитания.
Имеющиеся у вас даты не распознаются программой date
в их текущем формате. Он ожидает что-то похожее больше на дату с дефисами и двоеточиями, разделяющими поля, чем на число.
Вот пример, который использует sed
в функции для «фиксации» дат -, т.е. конвертирует их в формат, понятный date
, а затем использует date
для преобразования во время _t секунд, затем выполните вычитание:
#!/bin/bash
a=20170804020000
b=20170804015959
function fixdate() {
printf "$1" | sed -E -e 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3 \4:\5:\6/'
}
a_seconds="$(date -d "$(fixdate "$a")" '+%s')"
b_seconds="$(date -d "$(fixdate "$b")" '+%s')"
seconds=$((a_seconds - b_seconds))
echo "$seconds"
Это некрасиво, но у меня это работало в Centos:
a=20170804020000
b=20170804015959
ayear=${a:0:4}
amonth=${a:4:2}
aday=${a:6:2}
ahour=${a:8:2}
amin=${a:10:2}
asec=${a:12:2}
byear=${b:0:4}
bmonth=${b:4:2}
bday=${b:6:2}
bhour=${b:8:2}
bmin=${b:10:2}
bsec=${b:12:2}
adate=$(date -d "$amonth/$aday/$ayear $ahour:$amin:$asec" +"%s")
bdate=$(date -d "$bmonth/$bday/$byear $bhour:$bmin:$bsec" +"%s")
datediff=$((adate-bdate))