2012-11-26 13 views
6

Vorrei visualizzare un intervallo di tempo misurato in ore, minuti e secondi in cui alcune lunghezze sono maggiori di 24 ore. Attualmente sto provando questo:PHP DateTime(): visualizza un intervallo di tempo maggiore di 24 ore ma non di giorni se maggiore di 24 ore

$timeLength = new DateTime(); 
$timeLength->setTime(25, 30); 
echo $timeLength->format('H:m:i'); // 01:30:00 

Mi piacerebbe che venga visualizzato 25:30:00.

Sto cercando preferibilmente una soluzione orientata agli oggetti.

Grazie :)

+0

È necessario creare un'istanza DateTime? Sembra che tu abbia già le ore. – shapeshifter

+0

Ho semplificato il problema per renderlo più leggibile. Le istanze DateTime vengono create con grandi blocchi di secondi. Quindi è davvero come '$ timeLength-> setTime (0, 0, 6534293)'. – jcroll

+1

Dato che hai già il secondo, perché non lo calcoli? – Passerby

risposta

7

Dal momento che avete già la lunghezza in secondi, si può solo calcolare che:

function timeLength($sec) 
{ 
    $s=$sec % 60; 
    $m=(($sec-$s)/60) % 60; 
    $h=floor($sec/3600); 
    return $h.":".substr("0".$m,-2).":".substr("0".$s,-2); 
} 
echo timeLength(6534293); //outputs "1815:04:53" 

Se davvero si vuole utilizzare DateTime oggetto, ecco una (specie di truffa) soluzione:

function dtLength($sec) 
{ 
    $t=new DateTime("@".$sec); 
    $r=new DateTime("@0"); 
    $i=$t->diff($r); 
    $h=intval($i->format("%a"))*24+intval($i->format("%H")); 
    return $h.":".$i->format("%I:%S"); 
} 
echo dtLength(6534293); //outputs "1815:04:53" too 

Se avete bisogno OO e non la mente la creazione di una classe, si può provare

class DTInterval 
{ 
    private $sec=0; 
    function __construct($s){$this->sec=$sec;} 
    function formet($format) 
    { 
     /*$h=...,$m=...,$s=...*/ 
     $rst=str_replace("H",$h,$format);/*etc.etc.*/ 
     return $rst; 
    } 
} 
+0

+1 per l'approccio OO, vedrò se questo può essere migliorato. – Fr0zenFyr

2

DateTime gestisce l'ora del giorno, non gli intervalli di tempo. E poiché non ci sono le 25 in punto, è la cosa sbagliata da usare. C'è lo DateInterval che gestisce gli intervalli di date. Usalo o fai un calcolo manuale. Anche con DateInterval dovrai eseguire alcuni calcoli, poiché suddividerà un intervallo in giorni e ore. La cosa più semplice da fare è calcolare quello che ti serve in base ai secondi che hai già.

Problemi correlati