Convert seconds into days, hours, minutes and seconds

后端 未结 24 2282
说谎
说谎 2020-11-22 16:30

I would like to convert a variable $uptime which is seconds, into days, hours, minutes and seconds.

Example:



        
相关标签:
24条回答
  • 2020-11-22 16:47

    Short, simple, reliable :

    function secondsToDHMS($seconds) {
        $s = (int)$seconds;
        return sprintf('%d:%02d:%02d:%02d', $s/86400, $s/3600%24, $s/60%60, $s%60);
    }
    
    0 讨论(0)
  • 2020-11-22 16:47

    Although it is quite old question - one may find these useful (not written to be fast):

    function d_h_m_s__string1($seconds)
    {
        $ret = '';
        $divs = array(86400, 3600, 60, 1);
    
        for ($d = 0; $d < 4; $d++)
        {
            $q = (int)($seconds / $divs[$d]);
            $r = $seconds % $divs[$d];
            $ret .= sprintf("%d%s", $q, substr('dhms', $d, 1));
            $seconds = $r;
        }
    
        return $ret;
    }
    
    function d_h_m_s__string2($seconds)
    {
        if ($seconds == 0) return '0s';
    
        $can_print = false; // to skip 0d, 0d0m ....
        $ret = '';
        $divs = array(86400, 3600, 60, 1);
    
        for ($d = 0; $d < 4; $d++)
        {
            $q = (int)($seconds / $divs[$d]);
            $r = $seconds % $divs[$d];
            if ($q != 0) $can_print = true;
            if ($can_print) $ret .= sprintf("%d%s", $q, substr('dhms', $d, 1));
            $seconds = $r;
        }
    
        return $ret;
    }
    
    function d_h_m_s__array($seconds)
    {
        $ret = array();
    
        $divs = array(86400, 3600, 60, 1);
    
        for ($d = 0; $d < 4; $d++)
        {
            $q = $seconds / $divs[$d];
            $r = $seconds % $divs[$d];
            $ret[substr('dhms', $d, 1)] = $q;
    
            $seconds = $r;
        }
    
        return $ret;
    }
    
    echo d_h_m_s__string1(0*86400+21*3600+57*60+13) . "\n";
    echo d_h_m_s__string2(0*86400+21*3600+57*60+13) . "\n";
    
    $ret = d_h_m_s__array(9*86400+21*3600+57*60+13);
    printf("%dd%dh%dm%ds\n", $ret['d'], $ret['h'], $ret['m'], $ret['s']);
    

    result:

    0d21h57m13s
    21h57m13s
    9d21h57m13s
    
    0 讨论(0)
  • 2020-11-22 16:47

    All in one solution. Gives no units with zeroes. Will only produce number of units you specify (3 by default). Quite long, perhaps not very elegant. Defines are optional, but might come in handy in a big project.

    define('OneMonth', 2592000);
    define('OneWeek', 604800);  
    define('OneDay', 86400);
    define('OneHour', 3600);    
    define('OneMinute', 60);
    
    function SecondsToTime($seconds, $num_units=3) {        
        $time_descr = array(
                    "months" => floor($seconds / OneMonth),
                    "weeks" => floor(($seconds%OneMonth) / OneWeek),
                    "days" => floor(($seconds%OneWeek) / OneDay),
                    "hours" => floor(($seconds%OneDay) / OneHour),
                    "mins" => floor(($seconds%OneHour) / OneMinute),
                    "secs" => floor($seconds%OneMinute),
                    );  
    
        $res = "";
        $counter = 0;
    
        foreach ($time_descr as $k => $v) {
            if ($v) {
                $res.=$v." ".$k;
                $counter++;
                if($counter>=$num_units)
                    break;
                elseif($counter)
                    $res.=", ";             
            }
        }   
        return $res;
    }
    

    Feel free to down-vote, but be sure to try it in your code. It might just be what you need.

    0 讨论(0)
  • 2020-11-22 16:47

    I am editing one of the code to work it well when negative value comes. floor() function is not giving the correct count when the value is negative. So we need to use abs() function before using it in the floor() function. $inputSeconds variable can be the difference between the current time stamp and the required date.

    /** 
     * Convert number of seconds into hours, minutes and seconds 
     * and return an array containing those values 
     * 
     * @param integer $inputSeconds Number of seconds to parse 
     * @return array 
     */ 
    
    function secondsToTime($inputSeconds) {
    
        $secondsInAMinute = 60;
        $secondsInAnHour  = 60 * $secondsInAMinute;
        $secondsInADay    = 24 * $secondsInAnHour;
    
        // extract days
        $days = abs($inputSeconds / $secondsInADay);
        $days = floor($days);
    
        // extract hours
        $hourSeconds = $inputSeconds % $secondsInADay;
        $hours = abs($hourSeconds / $secondsInAnHour);
        $hours = floor($hours);
    
        // extract minutes
        $minuteSeconds = $hourSeconds % $secondsInAnHour;
        $minutes = abs($minuteSeconds / $secondsInAMinute);
        $minutes = floor($minutes);
    
        // extract the remaining seconds
        $remainingSeconds = $minuteSeconds % $secondsInAMinute;
        $seconds = abs($remainingSeconds);
        $seconds = ceil($remainingSeconds);
    
        // return the final array
        $obj = array(
            'd' => (int) $days,
            'h' => (int) $hours,
            'm' => (int) $minutes,
            's' => (int) $seconds,
        );
        return $obj;
    }
    
    0 讨论(0)
  • 2020-11-22 16:48
    a=int(input("Enter your number by seconds "))
    d=a//(24*3600)   #Days
    h=a//(60*60)%24  #hours
    m=a//60%60       #minutes
    s=a%60           #seconds
    print("Days ",d,"hours ",h,"minutes ",m,"seconds ",s)
    
    0 讨论(0)
  • 2020-11-22 16:49

    With DateInterval :

    $d1 = new DateTime();
    $d2 = new DateTime();
    $d2->add(new DateInterval('PT'.$timespan.'S'));
    
    $interval = $d2->diff($d1);
    echo $interval->format('%a days, %h hours, %i minutes and %s seconds');
    
    // Or
    echo sprintf('%d days, %d hours, %d minutes and %d seconds',
        $interval->days,
        $interval->h,
        $interval->i,
        $interval->s
    );
    
    // $interval->y => years
    // $interval->m => months
    // $interval->d => days
    // $interval->h => hours
    // $interval->i => minutes
    // $interval->s => seconds
    // $interval->days => total number of days
    
    0 讨论(0)
提交回复
热议问题