2008-09-17 13 views
5

Tengo duraciones de video almacenadas en formato HH: MM: SS. Me gustaría mostrarlo como horas HH, minutos MM, segundos SS. No debería mostrar horas si es menor que 1.¿Cómo se convierte 00:00:00 a horas, minutos, segundos en PHP?

¿Cuál sería el mejor enfoque?

+1

Las preguntas deben formularse en forma de una, eh, pregunta. ¿Qué crees que es esto, RentCoder? –

+0

Etiquetado como php ... –

+0

Edité la pregunta para cumplir con los estándares del sitio. – Espo

Respuesta

2

trate de usar dividida

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

¡Me gusta eso! ¡Muy agradable! –

3

¿Algo como esto?

$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'; 
+0

Eso es lo que tenía en mente, pero esperaba una solución más elegante, que quizás implicaría una función de php integrada. –

+0

No creo que exista tal función. De todos modos, si mueve este código a una función separada en lugar de usarlo en línea, debería ser igual de bueno – Nathan

+0

¡Por supuesto que tal función existe! El objeto DateTime y la fecha (strtotime()) manejan esto muy bien. Publiqué un ejemplo. – enobrev

1

Un pequeño cambio podría ser:

$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"; 
-1

explotar() es para los pensamientos. Este es un trabajo para regular expressions!

<?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 no probado, pero algo así debería funcionar. Tenga en cuenta que este código asume que el fragmento de la hora será siempre con dos dígitos (por ejemplo, un video de tres horas sería 03:00:00 en lugar de 3:00:00).

EDIT: En retrospectiva, el uso de expresiones regulares para esto es probablemente un caso de exceso de ingeniería; explode() hará el trabajo igual de bien y probablemente incluso sea más rápido en este caso. Pero fue el primer método que me vino a la mente cuando leí la pregunta.

1

Muy simple:

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

Esto sólo mostrará las horas o minutos si las hay, e inserta una "y" antes de que los segundos si hay horas, minutos o tanto para mostrar. Si quieres ser realmente elegante, puedes agregar un código para mostrar "hora" vs. "horas" según corresponda, lo mismo para minutos y segundos.

0

Aquí hay una manera diferente, con diferentes funciones, que es más abierta y más paso a paso para los novatos. también maneja las 1 hora y muchas horas ... podría intentar usar la misma lógica para manejar los 0 minutos y 0 segundos.

<?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'; 

?> 
0

Si realmente desea utilizar una función incorporada, tal vez por la robustez, puede intentar

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

y utilizar cualquiera de las funciones de formato de fecha (date(), strftime(), etc) a formato el tiempo de cualquier manera que desee. O puede usar la salida strptime($hms,'%T'). Cualquiera de los dos puede ser excesivo para el escenario simple que tienes.

-1

Conversión de 00:00:00 a horas, minutos y segundos en PHP es realmente fácil.

$ hours = 0; $ minutos = 0; $ segundos = 0;

0

Voy a responder con un enfoque diferente del problema. Mi enfoque es almacenar las longitudes en segundos.A continuación, en función de las necesidades, es fácil de hacer que estos segundos como hh: mm: ss mediante el uso de:

print gmdate($seconds >= 3600 ? 'H:i:s' : 'i:s', $seconds); (de tu pregunta)

o buscar en la longitud en una base de datos:

SELECT * FROM videos WHERE length > 300; de ejemplo, para buscar videos con una longitud superior a 5 minutos.

1

¿Por qué molestarse con expresiones regulares o explota cuando php maneja bien el tiempo?

$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); 

La ventaja es que puede volver a formatear el tiempo como usted quiera (incluyendo AM/PM, ajustes de zona horaria, suma/resta, etc.).

Cuestiones relacionadas