Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery

Seconds conversion

by dda (Friar)
on Jul 08, 2002 at 17:54 UTC ( #180252=perlquestion: print w/replies, xml ) Need Help??

dda has asked for the wisdom of the Perl Monks concerning the following question:

Hello All, I need to convert a value, given in seconds, to string like "1 day, 10 hours, 23 min, 44 sec". I wrote a simple script, but I'd like to check if there is any standard (?) ways to do it, or, at least, more elegant. Or, probably, the code has some bugs?


use strict; my $idle = 1332443; my ($days, $hours, $min, $sec); $days = round($idle/86400); $idle -= $days*86400; $hours = round($idle/3600); $idle -= $hours*3600; $min = round($idle/60); $idle -= $min*60; $sec = $idle; print "$days days, $hours hours, $min min, $sec sec\n"; sub round { my $value = $_[0]; return (sprintf('%.0f', 2 * $value / 2)); }


Replies are listed 'Best First'.
Re: Seconds conversion
by Albannach (Monsignor) on Jul 08, 2002 at 18:36 UTC
    Time::Duration is nice for this:
    >perl -MTime::Duration -e "print duration_exact(1332443)" 15 days, 10 hours, 7 minutes, and 23 seconds
    But even nicer in that it will supress the least significant units for larger durations:
    >perl -MTime::Duration -e "print duration(1332443)" 15 days and 10 hours
    If you'd rather do it yourself, you could avoid all the sprintfs with something like:
    my $d = int( $seconds / 86400 ); my $h = int( ($seconds - $d*86400) / 3600 ); my $m = int( ($seconds - $d*86400 - $h*3600) / 60 ); my $s = $seconds % 60; print "$d days, $h hours, $m min, $s sec\n";
    and if you want to be neat you can always fix the pluralization with a few bits like my $day_string = $d > 1 ? 'days' : 'day';

    I'd like to be able to assign to an luser

•Re: Seconds conversion
by merlyn (Sage) on Jul 08, 2002 at 18:40 UTC
Re: Seconds conversion
by ckohl1 (Hermit) on Jul 08, 2002 at 18:15 UTC
    I am not sure about a standard, but this idea may work:
    #!/usr/bin/perl use strict; print "${\SecondsToTime(22)}\n"; print "${\SecondsToTime(220)}\n"; print "${\SecondsToTime(2200)}\n"; print "${\SecondsToTime(22000)}\n"; exit; sub SecondsToTime { # Takes a number of seconds, and creates a string in the 'dd hh:mm +:ss' format. my ( $time ) = shift; $time = int( $time ); my $newTime = sprintf( "%.2d ", int($time / 86400) ); $newTime .= sprintf( "%.2d", int(($time % 86400) / 3600) ); $newTime .= ':' . sprintf( "%.2d", int(($time % 3600) / 60) ); $newTime .= ':' . sprintf( "%.2d", int(($time % 3600) % 60) ); return ( $newTime ); }

Re: Seconds conversion
by Matts (Deacon) on Jul 09, 2002 at 09:21 UTC
    Use Time::Seconds from the Time::Piece distribution. It allows you to do:

    my $secs = Time::Seconds->new(1332443); printf "%d days, %d hours, %d min, %d sec\n", $secs->days, $secs->hours, $secs->mins, $secs->secs;
Re: Seconds conversion
by dda (Friar) on Jul 09, 2002 at 10:27 UTC
    You guys are great! Thanks a lot.


Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://180252]
Approved by Corion
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (4)
As of 2021-05-11 12:48 GMT
Find Nodes?
    Voting Booth?
    Perl 7 will be out ...

    Results (116 votes). Check out past polls.