use strict; use warnings; sub hms_to_s { my ($hms) = @_; my ($h,$m,$s) = split /:/, $hms; return $h*60*60 + $m*60 + ($s||0); } for ( [qw( 08:00:00 17:00:00 )], [qw( 23:00:00 06:00:00 )], ) { my ($time1_hms, $time2_hms) = @$_; my $time1 = hms_to_s($time1_hms); my $time2 = hms_to_s($time2_hms); my $diff = ( ( $time2 + 24*60*60 ) - $time1 ) % (24*60*60); my $diff_h = int( $diff / (60*60) ); my $diff_m = int( $diff / 60 ) % 60; my $diff_s = $diff % 60; printf("%s -> %s: %02d:%02d:%02d\n", $time1_hms, $time2_hms, $diff_h, $diff_m, $diff_s, ); } #### 08:00:00 -> 17:00:00: 09:00:00 23:00:00 -> 06:00:00: 07:00:00