Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Seconds conversion

by dda (Friar)
on Jul 08, 2002 at 17:54 UTC ( [id://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?

Code:

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)); }

Thanks.
--dda

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 ); }


    Chris
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.

    --dda

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others imbibing at the Monastery: (4)
As of 2024-04-24 16:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found