Как получить миллисекунду между двумя объектами dateTime obj? - PullRequest
6 голосов
/ 26 октября 2010

Как получить миллисекунду между двумя DateTime объектами?

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

Я попытался следовать приведенному ниже комментарию, но получил ошибку.

$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();` 

Я получил ошибку

Вызов неопределенного метода DateTime:: getTimestamp ()

Ответы [ 3 ]

17 голосов
/ 26 октября 2010

В строгом смысле вы не можете.

Это потому, что наименьшая единица времени для класса DateTime - секунда.

Если вам нужно измерение, содержащее миллисекунды, используйте microtime ()


Редактировать:

С другой стороны, если вы просто хотите получить интервал в миллисекундах между двумя ISO-8601 datetimes , тогда одним из возможных решений будет

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

Остерегайтесь того, что по умолчанию вышеуказанная функция возвращает абсолютную разницу.Если вы хотите узнать, является ли первая дата более ранней или нет, тогда установите для третьего аргумента значение 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);

В системах, где размер типа данных времени равен 32 битам, например, в Windows7 или более ранних версиях, millisecsBetween isподходит только для дат от 1970-01-01 00:00:00 до 2038-01-19 03:14:07 (см. Год 2038, проблема ).

4 голосов
/ 03 апреля 2012

Извините, что выкопал старый вопрос, но я нашел способ получить отметку времени в миллисекундах из объекта DateTime:

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

Однако требуется, чтобы ваш объект DateTime содержал микросекунды (u в формате):

$date_str = "20:46:00.588";

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

Это работает только с PHP 5.2, следовательно, добавлена ​​поддержка микросекунд DateTime.

С этой функцией ваш код станет следующим:

$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);
0 голосов
/ 26 октября 2010

Даты DateTime хранятся только как целые секунды.Если вам все еще нужно количество миллисекунд между двумя датами DateTime, вы можете использовать getTimestamp (), чтобы получать каждый раз в секундах (затем получить разницу и превратить ее в миллисекунды):

$seconds_diff = $date2.getTimestamp() - $date.getTimestamp()
$milliseconds_diff = $seconds_diff * 1000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...