#!/volume/perl/bin/perl use warnings; use strict; use DateTime::Duration; my $first = "00:00:01:04"; my $last = "00:00:08:861"; sub my_parse_duration { my $in = shift; my %t; @t{qw/hours minutes seconds nanoseconds/} = $in=~/\A(\d\d):(\d\d):(\d\d):(\d\d\d?)\z/ or die "failed to parse '$in'"; $t{nanoseconds}*=1000000; # ms->ns return DateTime::Duration->new(%t); } sub my_fmt_duration { my @t = shift->in_units('hours','minutes','seconds','nanoseconds'); $t[3]/=1000000; # ns->ms return sprintf("%02d:%02d:%02d:%03d",@t); } $first = my_parse_duration($first); $last = my_parse_duration($last ); $last->subtract_duration($first); print my_fmt_duration($last ),"\n";