2012-04-23 12 views
16

que estoy tratando de hacer el tiempo transcurrido entre dos cadenas de fecha y hora (incluyendo milisegundos)php llegar microtime de cadena de fecha

ejemplo:

$pageTime = strtotime("2012-04-23T16:08:14.9-05:00"); 
$rowTime = strtotime("2012-04-23T16:08:16.1-05:00"); 
$timePassed = $rowTime - $pageTime; 
echo $timePassed . "<br/><br/>"; 

Lo que yo quiero ver se hizo eco es "1.2", pero strtotime() ignora la parte en milisegundos de la cadena. Además, al parecer, microtime() no le permite asignarle una fecha ... ¿Hay una función alternativa para calcular esto, o tendré que hacer un análisis sintáctico para extraer los segundos, milisegundos y restar?

Respuesta

11

Pruébalo con DateTime en su lugar.

Esto necesita un poco de una solución, porque DateInterval (que es devuelto por DateTime::diff()) no calcula los microsegundos, lo que necesita para esto a mano

$pageTime = new DateTime("2012-04-23T16:08:14.1 - 5 hours"); 
$rowTime = new DateTime("2012-04-23T16:08:16.9 - 5 hours"); 

// the difference through one million to get micro seconds 
$uDiff = abs($pageTime->format('u')-$rowTime->format('u'))/(1000 * 1000); 

$diff = $pageTime->diff($rowTime); 

echo $diff->format('%s')-$uDiff; 

Siempre recomiendo DateTime debido a su flexibilidad, usted debe buscar en ella

EDITAR

para revés compability a PHP 5.2 se tarda el mismo enfoque que f o los milisegundos:

$pageTime = new DateTime("2012-04-23T16:08:14.1 - 5 hours"); 
$rowTime = new DateTime("2012-04-23T16:08:16.9 - 5 hours"); 

// the difference through one million to get micro seconds 
$uDiff = abs($pageTime->format('u')-$rowTime->format('u'))/(1000 * 1000); 


$pageTimeSeconds = $pageTime->format('s'); 
$rowTimeSeconds = $rowTime->format('s'); 

if ($pageTimeSeconds + $rowTimeSeconds > 60) { 
    $sDiff = ($rowTimeSeconds + $pageTimeSeconds)-60; 
} else { 
    $sDiff = $pageTimeSeconds - $rowTimeSeconds; 
} 


if ($sDiff < 0) { 
    echo abs($sDiff) + $uDiff; 
} else { 
    // for the edge(?) case if $dt2 was smaller than $dt 
    echo abs($sDiff - $uDiff); 
} 
+0

maldito ... esto parece prometedor pero requiere 5.3+ y estoy en 5.2 y no tengo control sobre la actualización :(+1 a – slinkhi

+0

Esto se debe a 'DateTime :: diff()'. Esto significa que usted Necesito hacer esa substracción manualmente también, ver mi edición :). –

+0

Veo ... bueno, en general, parece que ayuda a extraer los datos más fácilmente (en lugar de utilizar expresiones regulares), pero creo que su matemática/lógica está apagada. Por ejemplo, si tengo '$ pageTime = new DateTime (" 2012-04-23T16: 08: 14.662-05: 00 "); $ rowTime = new DateTime ("2012-04-23T16: 08: 19.954-05: 00"); 'Debería obtener' 5.292' pero está sacando '4.708'. Además, su código solo aborda una diferencia de tiempo entre segundos y microsegundos. ¿Qué pasa si comienzas con '2012-04-23T16: 08: 59.9-05: 00' y finalizas con' 2012-04-23T16: 09: 00.1-05: 00' deberías obtener '0.2' pero tu código me da '58.2' .. (cont'd) – slinkhi

0

Sobre la base de la respuesta de Dan Lee, he aquí una solución universalmente trabajo:

$pageTime = new DateTime("2012-04-23T16:08:14.9-05:00"); 
$rowTime = new DateTime("2012-04-23T16:08:16.1-05:00"); 

$uDiff = ($rowTime->format('u') - $pageTime->format('u'))/(1000 * 1000); 

$timePassed = $rowTime->getTimestamp() - $pageTime->getTimestamp() + $uDiff; 

explicaciones completas:

  • Almacenamos la diferencia microsegundos firmado entre ambas fechas en $uDiff y convierta el resultado en segundos dividiendo por 1000 * 1000
  • El orden de los operandos en $uDiff es importante y tiene que ser el mismo que en la operación $ timePassed.
  • calculamos la marca de tiempo Unix (en segundos completos) diferencia entre ambas fechas y añadimos la diferencia microsegundos para obtener el resultado deseado
  • Usando DateTime::getTimestamp() dará una respuesta correcta incluso cuando la diferencia es mayor que 60 segundos