http://www.perlmonks.org?node_id=429834


in reply to Formatting elapsed time

The following code is a bit more complex. Sorry. But it produced output reflecting the amount of seconds. If something runs short, it says 3 seconds. If something takes longer, it says 1 hour, 3 seconds. If it takes even longer, the script can say 1 year, 3 monhts, 12 weeks, 4 days, 1 hour, 3 minutes, 20 seconds.
The code is implemented as a runtime tracker.
#!/usr/bin/perl my $t0; BEGIN { $t0 = time; } END { my $d = time() - $t0; my @int = ( [ 'second', 1 ], [ 'minute', 60 ], [ 'hour', 60*60 ], [ 'day', 60*60*24 ], [ 'week', 60*60*24*7 ], [ 'month', 60*60*24*30.5 ], [ 'year', 60*60*24*30.5*12 ] ); my $i = $#int; my @r; while ( ($i>=0) && ($d) ) { if ($d / $int[$i] -> [1] >= 1) { push @r, sprintf "%d %s%s", $d / $int[$i] -> [1], $int[$i]->[0], ( sprintf "%d", $d / $int[$i] -> [1] ) > 1 ? 's' : ''; } $d %= $int[$i] -> [1]; $i--; } my $runtime = join ", ", @r if @r; warn sprintf "RUNTIME %s\n", $runtime; } my $runTime = rand( 10 ); printf "Runtime is %d\n", $runTime; sleep( $runTime );

Replies are listed 'Best First'.
Re^2: Formatting elapsed time
by 5mi11er (Deacon) on Feb 10, 2005 at 19:57 UTC
    Well, hopefully it takes those 12 weeks and changes that into 2 more months :-)

    As a very minor nit, the definitions of year and month may need to be adjusted depending on just how precise one wants to be. There are several definitions/equivalencies for the exact length of a year located here.

    For example, using the current Sidereal year's approximation as 365.2564, a month is more accurately said to be 365.2564/12 or 30.438 rather than 30.5, and a year based on 30.5 * 12 is 366 days long...

    -Scott