http://www.perlmonks.org?node_id=110550
Description:

The following snippet turns a number of seconds to a compact string representing the equivalent amount of seconds in weeks, days, hours, minutes and seconds. This is useful for reporting elapsed time in an easily-graspable human-readable format (just how many weeks or days 123 456 789 seconds anyway)?

Here are some examples

1212s
601m0s
36001h0m0s
36011h0m1s
36611h1m1s
108003h0m0s
864011d0h0m1s
123456789204w0d21h33m9s

The code has a rather pleasing symmetry.

sub wdhms {
    my( $weeks, $days, $hours, $minutes, $seconds, $sign, $res ) = qw/
+0 0 0 0 0/;

    $seconds = shift;
    $sign    = $seconds == abs $seconds ? '' : '-';
    $seconds = abs $seconds;

    ($seconds, $minutes) = ($seconds % 60, int($seconds / 60)) if $sec
+onds;
    ($minutes, $hours  ) = ($minutes % 60, int($minutes / 60)) if $min
+utes;
    ($hours,   $days   ) = ($hours   % 24, int($hours   / 24)) if $hou
+rs;
    ($days,    $weeks  ) = ($days    %  7, int($days    /  7)) if $day
+s;

    $res = sprintf '%ds',     $seconds;
    $res = sprintf "%dm$res", $minutes if $minutes or $hours or $days 
+or $weeks;
    $res = sprintf "%dh$res", $hours   if             $hours or $days 
+or $weeks;
    $res = sprintf "%dd$res", $days    if                       $days 
+or $weeks;
    $res = sprintf "%dw$res", $weeks   if                             
+   $weeks;

    return "$sign$res";
}