Php получает микроспинд из строки даты - программирование
Подтвердить что ты не робот

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... Есть ли альтернативная функция для вычисления этого, или мне нужно будет провести синтаксический анализ строк, чтобы извлечь секунды и миллисекунды и вычесть?

4b9b3361

Ответ 1

Попробуйте использовать 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);
}

Ответ 2

Основываясь на ответе Дэна Ли, здесь универсально работающее решение:

$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 секунд.