Как вычесть две метки времени вместе с их датами в Bash?

У меня есть две переменные:

A = 04.07.2019 23:29:40 и B = 05.07.2019 01:15:52, я хочу выполнить арифметическую операцию C = A - B, используя Баш.

Может кто-нибудь помочь мне в преобразовании их в целые числа. В общем, даты каждый раз разные, поэтому нельзя пренебрегать датами.

Вывод должен быть в секундах / минутах. Если возможно в формате ЧЧ: ММ: СС.

3
задан 17 July 2019 в 10:51

1 ответ

Можно использовать date для преобразования в метку времени, которая является секундами вычтите секунды и затем преобразуйте назад в HH:MM:SS.

К сожалению, date не читает указанный формат, таким образом, мы должны обернуться DD.MM.YYYY кому: YYYY-MM-DD.

{
A="04.07.2019 23:29:40"
B="05.07.2019 01:15:52"

# Create a function to change DD.MM.YYYY HH:MM:SS to YYYY-MM-DD HH:MM:SS.
convert_date(){ printf '%s-%s-%s %s' ${1:6:4} ${1:3:2} ${1:0:2} ${1:11:8}; }

# Convert to timestamp
A_TS=$(date -d "$(convert_date "$A")" +%s)
B_TS=$(date -d "$(convert_date "$B")" +%s)

# Subtract
DIFF=$((B_TS-A_TS))

# convert to HH:MM:SS (note, that if it's more than one day, it will be wrong!)
TZ=UTC date -d @$DIFF +%H:%M:%S
}

Вывод:

01:46:12

Используя более общую функцию для вычитания дат:

diff_dates(){
    TS1=$(date -d "$1" +%s)
    TS2=$(date -d "$2" +%s)
    [ $TS2 -ge $TS1 ] \
        && TZ=UTC date -d @$((TS2-TS1)) +%H:%M:%S \
        || TZ=UTC date -d @$((TS1-TS2)) +-%H:%M:%S
}

convert_date(){
    printf '%s-%s-%s %s' ${1:6:4} ${1:3:2} ${1:0:2} ${1:11:8};
}

Использование:

$ A="04.07.2019 23:29:40"
$ B="05.07.2019 01:15:52"
$ diff_dates "$(convert_date "$A")" "$(convert_date "$B")"
01:46:12

или если Вы уже имеете date- совместимые даты:

$ diff_dates "2019-07-04 23:29:40" "2019-07-05 01:15:52"
01:46:12
$ diff_dates "2019-07-05 01:15:52" "2019-07-04 23:29:40"
-01:46:12
5
ответ дан 1 December 2019 в 15:32

Другие вопросы по тегам:

Похожие вопросы: