2010-11-04 7 views
0

Je veux juste sortir à la suite d'un script à exécuter via CLI le temps que l'exécution du script a pris.mise en forme de date php pour le décalage horaire

pour le faire, je mis un var au début du script

$start_time = time(); 

puis à la fin

date('H:i:s',time() - $start_time); 

le problème est que même lorsque le temps ellapsed peut-être dans la intervalle de secondes ou minutes, il imprime toujours qu'au moins une heure s'est écoulée:

>>> echo date('H:i:s',1); 
01:00:01 
>>> echo date('H:i:s', 10); 
01:00:10 
>>> echo date('H:i:s',3599); 
01:59:59 
>>> echo date('H:i:s',3600); 
02:00:00 

shouldn 't-il afficher 00: XX: YY, quand moins d'une heure s'est écoulée? Y at-il quelque chose qui me manque, y at-il un bug?

merci pour votre aide!

+2

Vous ne pouvez pas utiliser 'date()' cette façon: Il fonctionne avec horodatages La valeur '1' est en réalité le 1er janvier 1970, 0:00:01 GMT, ajustée à votre fuseau horaire. –

Répondre

2

du serveur Ne pas utiliser la date(). Quand vous avez time() - $start_time le résultat est en secondes. Multipliez ceci vers le haut si vous le voulez dans mintues etc. ou utilisez la fonction suivante pour convertir les secondes en heures, minutes et secondes.

<?php /** 
* 
* @convert seconds to hours minutes and seconds 
* 
* @param int $seconds The number of seconds 
* 
* @return string 
* 
*/ 
function secondsToWords($seconds) { 
    /*** return value ***/ 
    $ret = ""; 

    /*** get the hours ***/ 
    $hours = intval(intval($seconds)/3600); 
    if($hours > 0) 
    { 
     $ret .= "$hours hours "; 
    } 
    /*** get the minutes ***/ 
    $minutes = bcmod((intval($seconds)/60),60); 
    if($hours > 0 || $minutes > 0) 
    { 
     $ret .= "$minutes minutes "; 
    } 

    /*** get the seconds ***/ 
    $seconds = bcmod(intval($seconds),60); 
    $ret .= "$seconds seconds"; 

    return $ret; 
} ?> 

Exemple d'utilisation:

<?php 
    /*** time since EPOCH ***/ 
    echo secondsToWords(time()); 
?> 
0

Utilisez gmdate() au lieu de la date() pour afficher la différence de temps correcte et compenser le fuseau horaire

+0

timezone ne devrait pas faire de différence si vous prenez juste un certain nombre de secondes à partir d'un autre nombre de secondes. – drew

+0

gmdate() semble renvoyer des valeurs correctes, mais dans les docs, il lit que la fonction est identique à date() et il reçoit également un horodatage comme paramètre – msonsona

+0

@ user495812: cela fait une différence car les valeurs spécifiées dans le les exemples sont absolus (basés sur GMT). – stillstanding

2

Vous pouvez essayer cette fonction:

<? 

$time = strtotime('2010-04-28 17:25:43'); 

echo 'event happened '.humanTiming($time).' ago'; 

function humanTiming ($time) 
{ 

    $time = time() - $time; // to get the time since that moment 

    $tokens = array (
     31536000 => 'year', 
     2592000 => 'month', 
     604800 => 'week', 
     86400 => 'day', 
     3600 => 'hour', 
     60 => 'minute', 
     1 => 'second' 
    ); 

    foreach ($tokens as $unit => $text) { 
     if ($time < $unit) continue; 
     $numberOfUnits = floor($time/$unit); 
     return $numberOfUnits.' '.$text.(($numberOfUnits>1)?'s':''); 
    } 

} 


?> 

D'ici: PHP How to find the time elapsed since a date time?

Cela vous donnera un meilleur moyen d'obtenir la différence . Remplacez simplement strtotime('2010-04-28 17:25:43'); par la date et l'heure de début (en tant qu'horodatage). L'un des avantages est que la fonction peut être réutilisée ailleurs.

+0

gentil, mais pour l'instant ne pas besoin de la traduction en texte, merci! – msonsona

2

Essayez ceci:

echo "Time left:". date('H:i:s', (strtotime('2000-01-01 00:00:00') + (time()-$start_time))); 
0

Cette fonction donne un "entièrement" au format chaîne de temps lisible par l'homme ..

function humantime ($oldtime, $newtime = null, $returnarray = false) { 
     if(!$newtime) $newtime = time(); 
     $time = $newtime - $oldtime; // to get the time since that moment 
     $tokens = array (
       31536000 => 'year', 
       2592000 => 'month', 
       604800 => 'week', 
       86400 => 'day', 
       3600 => 'hour', 
       60 => 'minute', 
       1 => 'second' 
     ); 
     $htarray = array(); 
     foreach ($tokens as $unit => $text) { 
       if ($time < $unit) continue; 
       $numberOfUnits = floor($time/$unit); 
       $htarray[$text] = $numberOfUnits.' '.$text.(($numberOfUnits>1)?'s':''); 
       $time = $time - ($unit * $numberOfUnits); 
     } 
     if($returnarray) return $htarray; 
     return implode(' ', $htarray); 
    } 
Questions connexes