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
In reply to Re: Subtract Hours
by ikegami
in thread Subtract Hours
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |