php получает микроспинд из строки даты

Я пытаюсь получить время, прошедшее между двумя строками 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.
  • Мы вычисляем временную метку Unix (в полных секундах) между обеими датами и добавляем разницу в микросекундах, чтобы получить желаемый результат
  • Использование DateTime::getTimestamp() даст правильный ответ, даже если разница больше 60 секунд