Это даст вам дату в секундах (с эпохи UNIX)
date --date '2017-08-17 04:00:01' +%s # "1502938801"
И это даст вам дату в виде читаемой строки из нескольких секунд
date --date '@1502938801' # "17 Aug 2017 04:00:01"
Таким образом, все, что вам нужно, это преобразовать вашу дату/временную метку в формат, понятный GNU date
, использовать математику для определения разницы и вывести результат
datetime1=20170817040001
datetime2=20160312000101
# bash string manipulation
datestamp1="${datetime1:0:4}-${datetime1:4:2}-${datetime1:6:2} ${datetime1:8:2}:${datetime1:10:2}:${datetime1:12:2}"
datestamp2="${datetime2:0:4}-${datetime2:4:2}-${datetime2:6:2} ${datetime2:8:2}:${datetime2:10:2}:${datetime2:12:2}"
# otherwise use sed
# datestamp1=$(echo "$datetime1" | sed -nr 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3 \4:\5:\6/p')
# datestamp2=$(echo "$datetime2" | sed -nr 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3 \4:\5:\6/p')
seconds1=$(date --date "$datestamp1" +%s)
seconds2=$(date --date "$datestamp2" +%s)
delta=$((seconds1 - seconds2))
echo "$delta seconds" # "45197940 seconds"
Мы не предоставили здесь информацию о часовом поясе, поэтому предполагается местный часовой пояс. Ваши значения секунд от даты и времени, вероятно, будут отличаться от моих. (Если ваши значения UTC, вы можете использовать date --utc
.)