example current php strtotime microtime

current - php microtime example



php obtener microtime de la cadena de fecha (2)

Estoy tratando de pasar el tiempo entre dos cadenas de fecha y hora (incluidos milisegundos)

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 quiero ver en eco es "1.2" pero strtotime() ignora la parte de milisegundos de la cadena. Además, al parecer, microtime() no te permite darle una fecha de referencia ... ¿Existe una función alternativa para calcular esto o tendré que hacer un análisis de cadena para extraer los segundos y milisegundos y restar?


Pruébalo con DateTime lugar.

Esto necesita un poco de una solución porque DateInterval (que es devuelto por DateTime::diff() ) no calcula los microsegundos, por lo que debe hacerlo manualmente.

$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, deberías buscarlo

EDITAR

Para la compatibilidad hacia atrás con PHP 5.2, se toma el mismo enfoque que para 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); }


Sobre la base de la respuesta de Dan Lee, aquí hay una solución que funciona de manera universal:

$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 de microsegundos firmada entre ambas fechas en $uDiff y convertimos el resultado en segundos al dividir 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 diferencia de fecha y hora de Unix (en segundos completos) entre ambas fechas y agregamos la diferencia de microsegundos para obtener el resultado deseado
  • Usar DateTime::getTimestamp() dará una respuesta correcta incluso cuando la diferencia sea mayor a 60 segundos