in reply to Subtract Hours
Without date info, you can sort the times (if ( $time1 > $time2 )) or you can do what you asked, but you can't do both.
You problem can be solved by adding 24 hours to the later time, and modding the hours by 24.
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
|
|---|