use Date::Calc qw( Add_Delta_DHMS Date_to_Days ); @date1 = (2002,8,31,23,59,1); @date2 = (2002,9,1,11,30,59); @d1 = ( Date_to_Days(@date1[0..2]), ($date1[3]*60+$date1[4])*60+$date1[5] ); @d2 = ( Date_to_Days(@date2[0..2]), ($date2[3]*60+$date2[4])*60+$date2[5] ); @diff = ( $d1[0]-$d2[0], $d1[1]-$d2[1] ); if ($diff[0] > 0 and $diff[1] < 0) { $diff[0]--; $diff[1] += 86400; } if ($diff[0] < 0 and $diff[1] > 0) { $diff[0]++; $diff[1] -= 86400; } if ($diff[0] > 0 || $diff[0] == 0 && $diff[1] >= 0) { ... } #### sub Compare_Vectors { my( $x, $y )= @_; for my $i ( 0..$#x ) { my $cmp= $x[$i] <=> ( $y[$i] || 0 ); return $cmp if $cmp; } return 0 <=> ( $y[@x] || 0 ); } sub Delta_YMDHMS { my $x= [ splice @_, 0, 6 ]; my $y= [ @_ ]; my $sign= 1; if( Compare_Vectors( $x, $y ) < 0 ) { $sign= -1; ( $x, $y )= ( $y, $x ); } return map $sign*$_, Date::Calc::Delta_YMDHMS( @$x, @$y ); }