Я пытаюсь получить время, прошедшее между двумя строками datetime (включая миллисекунды)
пример:
$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/>";
То, что я хочу видеть эхом, – «1,2», но strtotime()
игнорирует миллисекунду часть строки. Кроме того, по-видимому, microtime()
не позволяет вам дать ему datestring … Есть ли альтернативная функция для вычисления этого, или мне нужно будет провести синтаксический анализ строк, чтобы извлечь секунды и миллисекунды и вычесть?
Попробуйте вместо этого использовать DateTime .
Это требует некоторого обходного пути, потому что DateInterval
(возвращаемый DateTime::diff()
) не вычисляет микросекунды, поэтому вам нужно это вручную
$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;
Я всегда рекомендую DateTime
из-за его гибкости, вы должны изучить его
РЕДАКТИРОВАТЬ
Для обратной совместимости с PHP 5.2 он использует тот же подход, что и для миллисекунд:
$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); }
Основываясь на ответе Дэна Ли, вот универсально работающее решение:
$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;
Полное объяснение:
$uDiff
и конвертируем результат в секундах, делясь на 1000 * 1000 $uDiff
важен и должен быть таким же, как в операции $ timePassed. DateTime::getTimestamp()
даст правильный ответ, даже если разница больше 60 секунд