use warnings; use strict; use DateTime::Duration; use DateTime::Format::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); } $first = my_parse_duration($first); $last = my_parse_duration($last ); my $fmt_out = DateTime::Format::Duration->new( pattern=>'%H:%M:%S:%3N', normalize=>1 ); print $fmt_out->format_duration($first),"\n"; print $fmt_out->format_duration($last ),"\n"; $last->subtract_duration($first); print $fmt_out->format_duration($last ),"\n"; __END__ 00:00:01:004 00:00:08:861 00:00:07:857