2010-10-26 7 views
6

¿Cómo obtener milisegundos entre dos objetos DateTime?¿Cómo obtener milisegundos entre dos dateTime obj?

$date = new DateTime(); 
$date2 = new DateTime("1990-08-07 08:44"); 

Intenté seguir el comentario a continuación, pero recibí un error.

$stime = new DateTime($startTime->format("d-m-Y H:i:s")); 
$etime = new DateTime($endTime->format("d-m-Y H:i:s")); 
$millisec = $etime->getTimestamp() - $stime->getTimestamp();` 

me sale el error

llamada a DateTime :: método no definido getTimestamp()

Respuesta

-1

fechas DateTime se almacenan sólo como segundos enteros. Si aún necesita el número de milisegundos entre dos fechas de fecha y hora, entonces se puede utilizar getTimestamp() para obtener cada vez en segundos (a continuación, obtener la diferencia y convertirlo en milisegundos):

$seconds_diff = $date2.getTimestamp() - $date.getTimestamp() 
$milliseconds_diff = $seconds_diff * 1000 
+3

-1 Lol .. sí, segundos tiempos 1000 es milisegundos. – Fosco

+0

Probablemente podría haber mencionado lo que mencionó Saul :) – BudgieInWA

+1

+1 ya que este es realmente el único método (en concepto al menos) para tomar dos fechas de segunda precisión y obtener el número de milisegundos entre ellas ... – ircmaxell

15

En el sentido estricto, no puedes

Se debe a que la unidad de tiempo más pequeña para la clase DateTime es un segundo.

Si necesita una medición que contiene milisegundos después utilice microtime()


Editar:

Por otro lado si simplemente desea obtener el intervalo en milisegundos entre dos ISO-8601 datetimes entonces una solución posible sería

function millisecsBetween($dateOne, $dateTwo, $abs = true) { 
    $func = $abs ? 'abs' : 'intval'; 
    return $func(strtotime($dateOne) - strtotime($dateTwo)) * 1000; 
} 

Ten cuidado con eso Por defecto, la función anterior devuelve la diferencia absoluta. Si desea saber si la primera fecha es anterior o no, establezca el tercer argumento en falso.

// Outputs 60000 
echo millisecsBetween("2010-10-26 20:30", "2010-10-26 20:31"); 

// Outputs -60000 indicating that the first argument is an earlier date 
echo millisecsBetween("2010-10-26 20:30", "2010-10-26 20:31", false); 

En los sistemas donde el tamaño del tipo de datos de tiempo es de 32 bits, tales como Windows7 o anterior, millisecsBetween sólo es bueno para fechas entre 1970-01-01 00:00:00 y 2038-01-19 03:14:07 (véase Year 2038 problem).

+0

Desde el microtiempo manual() se devuelve la fecha actual. –

+0

Lo mismo ocurre con $ date = new DateTime(); – Saul

+0

¿Estás seguro de que DateTime usa internamente una marca de tiempo UNIX? Pensé que podría representar una gama más amplia de fechas. –

4

sentimos a digg a cabo una vieja pregunta, pero he encontrado una manera de conseguir la marca de tiempo de milisegundos de un objeto DateTime:

function dateTimeToMilliseconds(\DateTime $dateTime) 
{ 
    $secs = $dateTime->getTimestamp(); // Gets the seconds 
    $millisecs = $secs*1000; // Converted to milliseconds 
    $millisecs += $dateTime->format("u")/1000; // Microseconds converted to seconds 
    return $millisecs; 
} 

No obstante, requiere que su objeto DateTime contiene los microsegundos (u en el formato):

$date_str = "20:46:00.588"; 

$date = DateTime::createFromFormat("H:i:s.u", $date_str); 

Esto está trabajando sólo a partir de PHP 5.2, por tanto, los microsegundos apoyan a DateTime se ha añadido a continuación.

Con esta función, el código se convertiría en lo siguiente:

$date_str = "1990-08-07 20:46:00.588"; 
$date1 = DateTime::createFromFormat("Y-m-d H:i:s.u", $date_str); 

$msNow = (int)microtime(true)*1000; 

echo $msNow - dateTimeToMilliseconds($date1); 
Cuestiones relacionadas