Что насчет этого?
#!/usr/bin/env bash
echo "BASH_VERSION:" $BASH_VERSION
line="2020-05-21 05:52:47;2020-05-28 19:37:36"
IFS=';' read -a dates <<< $line
startDatetime=${dates[0]}
endDatetime=${dates[1]}
echo "| dates -> " ${dates[@]}
echo "|> startDatetime -> ${startDatetime}"
echo "|> endDatetime -> ${endDatetime}"
startTime=$(date -jf "%Y-%m-%d %H:%M:%S" "${startDatetime}" +%s)
endTime=$(date -jf "%Y-%m-%d %H:%M:%S" "${endDatetime}" +%s)
diffSeconds="$(($endTime-$startTime))"
echo "Diff in seconds: $diffSeconds"
# at this point you have the diff in seconds and you can parse it however you want :)
diffTime=$(gdate -d@${diffSeconds} -u +%H:%M:%S) # you'll need `brew install coreutils`
echo "Diff time(H:M:S): $diffTime"
Вывод:
BASH_VERSION: 5.0.17(1)-release
| dates -> 2020-05-21 05:52:47 2020-05-28 19:37:36
|> startDatetime -> 2020-05-21 05:52:47
|> endDatetime -> 2020-05-28 19:37:36
Diff in seconds: 654289
Diff time(H:M:S): 13:44:49
Для установки последней bash
я нашел этот средний пост .
Примечание: если это не сработает из-за несовместимости версий с функцией date
, например, идея должна быть очень похожей, и вы можете найти обходной путь, который адаптируется к вашей текущей версии, я конечно. С логической точки зрения, самое простое решение, которое я вижу:
1-й) Разделите строку на две: по одной для каждого DateTimes.
2-й) Преобразуйте каждый DateTime из строки в даты.
3-й) Примените разницу между этими датами: используя секунды от каждой.
4-й) Имея разницу в секундах, вы можете отображать ее как хотите (год, дни, минуты, секунды)