Domanda

Ho le durate dei video archiviate nel formato HH:MM:SS.Vorrei visualizzarlo come ore HH, minuti MM, secondi SS.Non dovrebbe visualizzare le ore se sono inferiori a 1.

Quale sarebbe l'approccio migliore?

È stato utile?

Soluzione

prova a usare la divisione

list($hh,$mm,$ss)= split(':',$duration);

Altri suggerimenti

Qualcosa come questo?

$vals = explode(':', $duration);

if ( $vals[0] == 0 )
   $result = $vals[1] . ' minutes, ' . $vals[2] . ' seconds';
else
   $result = $vals[0] . 'hours, ' . $vals[1] . ' minutes, ' . $vals[2] . ' seconds';

Una piccola modifica potrebbe essere:

$vals = explode(':', $duration);

if ( $vals[0] == 0 )
   $result = "{$vals[1]} minutes, {$vals[2]} seconds";
else
   $result = "{$vals[0]} hours, {$vals[1]} minutes, {$vals[2]} seconds";

Abbastanza semplice:

list( $h, $m, $s) = explode(':', $hms);
echo ($h ? "$h hours, " : "").($m ? "$m minutes, " : "").(($h || $m) ? "and " : "")."$s seconds";

Verranno visualizzate solo le ore o i minuti, se presenti, e verrà inserito un "e" prima dei secondi se ci sono ore, minuti o entrambi da visualizzare.Se volessi essere davvero fantasioso, potresti aggiungere del codice per visualizzare "ora" vs."ore" a seconda dei casi, idem per minuti e secondi.

Perché preoccuparsi delle espressioni regolari o delle esplosioni quando php gestisce bene il tempo?

$sTime   = '04:20:00';
$oTime   = new DateTime($sTime);
$aOutput = array();
if ($oTime->format('G') > 0) {
    $aOutput[] = $oTime->format('G') . ' hours';
}
$aOutput[] = $oTime->format('i') . ' minutes';
$aOutput[] = $oTime->format('s') . ' seconds';
echo implode(', ', $aOutput);

Il vantaggio è che puoi riformattare l'ora come preferisci (inclusi am/pm, aggiustamenti per fuso orario, addizione/sottrazione, ecc.).

Ecco un modo diverso, con funzioni diverse, più aperto e più passo dopo passo per i principianti.gestisce anche 1 ora e molte ore...potresti provare a utilizzare la stessa logica per gestire 0 minuti e 0 secondi.

<?php
// your time
$var = "00:00:00";

if(substr($var, 0, 2) == 0){
    $myTime = substr_replace(substr_replace($var, '', 0, 3), ' Minutes, ', 2, 1);
}
elseif(substr($var, 1, 1) == 1){
$myTime = substr_replace(substr_replace($var, ' Hour, ', 2, 1), ' Minutes, ', 11, 1);   
    }
else{
$myTime = substr_replace(substr_replace($var, ' Hours, ', 2, 1), ' Minutes, ', 12, 1);
}
// work with your variable
echo  $myTime .' Seconds';

?>

Risponderò con un approccio diverso al problema.Il mio approccio è memorizzare le lunghezze in secondi.Quindi, a seconda delle esigenze, è facile rendere questi secondi come hh:mm:ss utilizzando:

print gmdate($seconds >= 3600 ? 'H:i:s' : 'i:s', $seconds); (per la tua domanda)

oppure per cercare la lunghezza in un database:

SELECT * FROM videos WHERE length > 300; ad esempio per cercare video con durata superiore a 5 minuti.

Se vuoi davvero utilizzare una funzione integrata, magari per robustezza, puoi provare

 date_default_timezone_set('UTC'); 
 $date = strtotime($hms,0); 

e utilizzare una qualsiasi delle funzioni di formattazione della data (date(), strftime(), ecc.) per formattare l'ora nel modo desiderato.Oppure puoi usare l'output di strptime($hms,'%T').Entrambi potrebbero essere eccessivi per il semplice scenario che hai.

esplodere() è per le viole del pensiero.Questo è un lavoro per espressioni regolari!

<?php
preg_match('/^(\d\d):(\d\d):(\d\d)$/', $video_duration, $parts);
if ($parts[1] !== '00') {
    echo("{$parts[1]} hours, {$parts[2]} minutes, {$parts[3]} seconds");
}
else {
    echo("{$parts[2]} minutes, {$parts[3]} seconds");
}

Totalmente non testato, ma qualcosa del genere dovrebbe funzionare.Tieni presente che questo codice presuppone che il frammento dell'ora lo farà Sempre essere di due cifre (ad esempio, un video di tre ore sarebbe 03:00:00 invece di 3:00:00).

MODIFICARE: In retrospettiva, l'utilizzo delle espressioni regolari per questo è probabilmente un caso di ingegneria eccessiva;esplodere() farà altrettanto bene il lavoro e probabilmente sarà anche più veloce in questo caso.Ma è stato il primo metodo che mi è venuto in mente quando ho letto la domanda.

Convertire 00:00:00 in ore, minuti e secondi in PHP è davvero semplice.

$ore = 0;$minuti = 0;$secondi = 0;

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top