Convert seconds into days, hours, minutes and seconds

后端 未结 24 2530
说谎
说谎 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:51

    I don't know why some of these answers are ridiculously long or complex. Here's one using the DateTime Class. Kind of similar to radzserg's answer. This will only display the units necessary, and negative times will have the 'ago' suffix...

    function calctime($seconds = 0) {
    
        $datetime1 = date_create("@0");
        $datetime2 = date_create("@$seconds");
        $interval = date_diff($datetime1, $datetime2);
    
        if ( $interval->y >= 1 ) $thetime[] = pluralize( $interval->y, 'year' );
        if ( $interval->m >= 1 ) $thetime[] = pluralize( $interval->m, 'month' );
        if ( $interval->d >= 1 ) $thetime[] = pluralize( $interval->d, 'day' );
        if ( $interval->h >= 1 ) $thetime[] = pluralize( $interval->h, 'hour' );
        if ( $interval->i >= 1 ) $thetime[] = pluralize( $interval->i, 'minute' );
        if ( $interval->s >= 1 ) $thetime[] = pluralize( $interval->s, 'second' );
    
        return isset($thetime) ? implode(' ', $thetime) . ($interval->invert ? ' ago' : '') : NULL;
    }
    
    function pluralize($count, $text) {
        return $count . ($count == 1 ? " $text" : " ${text}s");
    }
    
    // Examples:
    //    -86400 = 1 day ago
    //     12345 = 3 hours 25 minutes 45 seconds
    // 987654321 = 31 years 3 months 18 days 4 hours 25 minutes 21 seconds
    

    EDIT: If you want to condense the above example down to use less variables / space (at the expense of legibility), here is an alternate version that does the same thing:

    function calctime($seconds = 0) {
        $interval = date_diff(date_create("@0"),date_create("@$seconds"));
    
        foreach (array('y'=>'year','m'=>'month','d'=>'day','h'=>'hour','i'=>'minute','s'=>'second') as $format=>$desc) {
            if ($interval->$format >= 1) $thetime[] = $interval->$format . ($interval->$format == 1 ? " $desc" : " {$desc}s");
        }
    
        return isset($thetime) ? implode(' ', $thetime) . ($interval->invert ? ' ago' : '') : NULL;
    }
    

提交回复
热议问题