You can use date
to convert to timestamp which is seconds, subtract the seconds and then convert back to HH:MM:SS
.
Unfortunately, date
doesn't read the specified format, so we need to turn around the DD.MM.YYYY
to 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
}
Output:
01:46:12
Using a more general function to subtract the dates:
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};
}
Usage:
$ 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
or if you already have date
-compatible dates:
$ 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
date
to convert each date to seconds since epoc, subtract them and the convert the resulting seconds back to HH:MM:SS. Seeman date
on howto specify date formats, or convert the date format so that date command understands it natively.