Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get millisecond between two dateTime obj?

Tags:

php

datetime

How to get millisecond between two DateTime objects?

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

I tried to follow the comment below, but I got an 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();` 

I get the error

Call to undefined method DateTime::getTimestamp()

like image 674
Prince OfThief Avatar asked Oct 26 '10 18:10

Prince OfThief


2 Answers

In the strict sense, you can't.

It's because the smallest unit of time for the DateTime class is a second.

If you need a measurement containing milliseconds then use microtime()


Edit:

On the other hand if you simply want to get the interval in milliseconds between two ISO-8601 datetimes then one possible solution would be

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

Beware that by default the above function returns absolute difference. If you want to know whether the first date is earlier or not then set the third argument to false.

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

On systems where the size of time datatype is 32 bits, such as Windows7 or earlier, millisecsBetween is only good for dates between 1970-01-01 00:00:00 and 2038-01-19 03:14:07 (see Year 2038 problem).

like image 146
Saul Avatar answered Oct 13 '22 00:10

Saul


Sorry to digg out an old question, but I've found a way to get the milliseconds timestamp out of a DateTime object:

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;
}

It requires however that your DateTime object contains the microseconds (u in the format):

$date_str = "20:46:00.588";

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

This is working only since PHP 5.2 hence the microseconds support to DateTime has been added then.

With this function, your code would become the following :

$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);
like image 20
Hugo Briand Avatar answered Oct 13 '22 00:10

Hugo Briand