php get microtime from date string
Try it with DateTime instead.
This needs a bit of a workaround because DateInterval
(which is returned by DateTime::diff()
) doesn't calculate the microseconds, so you need to this by hand
$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;
I always recommend DateTime
because of its flexibility, you should look into it
EDIT
For backwards compability to PHP 5.2 it takes the same approach as for the milliseconds:
$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);}
Building on Dan Lee's answer, here's a universally working solution:
$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;
Complete explanations:
- We store the signed microseconds difference between both dates in
$uDiff
and convert the result in seconds by dividing by 1000 * 1000 - The order of the operands in
$uDiff
is important and has to be the same as in the $timePassed operation. - We compute the Unix timestamp (in full seconds) difference between both dates and we add the microseconds difference to get the wanted result
- Using
DateTime::getTimestamp()
will give a correct answer even when the difference is greater than 60 seconds