2010-12-11 56 views
0

Je suis en train de formater une date pour dire combien de temps il reste (dans un format lisible) de la façon dont nombre de secondes restantes:php - il reste quelques secondes?

<?php 
    $seconds = 23414; 
    $date = new DateTime(); 
    $date->setTime(0, 0, $seconds); 
    echo $date->format('z G:i:s'); 
?> 

Cet exemple pourrait quelque chose comme de sortie: 344 11:46:45 qui est pas ce que je aimerais. Il devrait dire quelque chose comme 6 days, 4:12:36. Je ne vois rien ici: http://www.php.net/manual/en/function.date.php qui m'aiderait à le formater correctement. Des idées?

Répondre

2

Je ne connais rien construit, mais il est assez facile d'écrire:

function formatSeconds($secondsLeft) { 

    $minuteInSeconds = 60; 
    $hourInSeconds = $minuteInSeconds * 60; 
    $dayInSeconds = $hourInSeconds * 24; 

    $days = floor($secondsLeft/$dayInSeconds); 
    $secondsLeft = $secondsLeft % $dayInSeconds; 

    $hours = floor($secondsLeft/$hourInSeconds); 
    $secondsLeft = $secondsLeft % $hourInSeconds; 

    $minutes= floor($secondsLeft/$minuteInSeconds); 

    $seconds = $secondsLeft % $minuteInSeconds; 

    $timeComponents = array(); 

    if ($days > 0) { 
    $timeComponents[] = $days . " day" . ($days > 1 ? "s" : ""); 
    } 

    if ($hours > 0) { 
    $timeComponents[] = $hours . " hour" . ($hours > 1 ? "s" : ""); 
    } 

    if ($minutes > 0) { 
    $timeComponents[] = $minutes . " minute" . ($minutes > 1 ? "s" : ""); 
    } 

    if ($seconds > 0) { 
    $timeComponents[] = $seconds . " second" . ($seconds > 1 ? "s" : ""); 
    } 

    if (count($timeComponents) > 0) { 
    $formattedTimeRemaining = implode(", ", $timeComponents); 
    $formattedTimeRemaining = trim($formattedTimeRemaining); 
    } else { 
    $formattedTimeRemaining = "No time remaining."; 
    } 

    return $formattedTimeRemaining; 

} 

Je ne l'ai pas testé à fond, mais les tests que je couriez a bien fonctionné. Vous pourriez vouloir le tester vous-même un peu avant de l'utiliser.

+0

+1 pour la division et le module. un peu plus vite que mon 'while' :) –

+0

Merci. Vous étiez un peu plus précis que j'étais avec le formatage. J'ai opté pour la route facile, mais vous avez pris le temps de créer un format HH: MM: SS comme OP mentionné. – AgentConundrum

0

Quelque chose comme:

$SECONDS_IN_MINUTE = 60; 
$SECONDS_IN_HOUR = $SECONDS_IN_MINUTE * 60; 
$SECONDS_IN_DAY = $SECONDS_IN_HOUR * 24; 

$days = 0; 
$hours = 0; 
$minutes = 0; 
$seconds = 23414; 

while ($seconds > $SECONDS_IN_DAY) { 
    $days++; 
    $seconds -= $SECONDS_IN_DAY; 
} 
while ($seconds > $SECONDS_IN_HOUR) { 
    $hours++; 
    $seconds -= $SECONDS_IN_HOUR; 
} 
while ($seconds > $SECONDS_IN_MINUTE) { 
    $minutes++; 
    $seconds -= $SECONDS_IN_MINUTE; 
} 

echo ($days > 0 ? $days . ' day' . ($days > 1 ? 's' : '') . ', ' : '') . 
    $hours . ':' . str_pad($minutes, 2, '0', STR_PAD_LEFT) . ':' . str_pad($seconds, 2, '0', STR_PAD_LEFT); 

sale, mais devrait fonctionner.

+0

BTW: 23414 secondes = '6:30:14', pas '6 jours, 4:12:36' –

+0

Léger problème avec l'écho à la fin. Vous devez ajouter un zéro non significatif lorsque vous formatez les heures, les minutes et les secondes en dessous de 10, sinon vous obtiendrez des résultats comme "12: 4: 32". – AgentConundrum

+0

@AgentConundrum, vrai. J'ai ajouté 'str_pad' pour corriger ce –