2012-03-11 1 views
1

Я пытаюсь получить разницу во времени в миллисекундах.Странное поведение PHP DateTime Класс

$_SESSION['startTime'] = time(); 
$to_time = time(); 

//I call the code from here after a delay, say 4 seconds 

$from_time = $_SESSION['startTime']; 
$d1 = new DateTime($from_time); 
$d2 = new DateTime($to_time); 


print_r($d1->diff($d2)); 

распечатать результат через 4 секунды, и результат примерно так:

DateInterval Object 
(
    [y] => 4 //---- Problem, this value should be + 
    [m] => 0 //         | 
    [d] => 0 //         | 
    [h] => 0 //         |  
    [i] => 0 //         | 
    [s] => 0 //<-here-----------------------------+ 
    [invert] => 1 
    [days] => 1461 
) 

[s] должно быть 4. почему 4 находится в секции года? Что я делаю неправильно?

ОБНОВЛЕНИЕ - решаемые

$to_time = (microtime(true)); 
$from_time = ($_SESSION['startTime']); 
$diff = $to_time - $from_time; 
print $diff; 

Печать

3.xxxxxx 
+8

Если у вас уже есть 2 UNIX метки времени, почему бы не просто вычесть их напрямую? Кроме того, если вы ищете точность ms, вам нужно microtime(). – Corbin

ответ

3

Вы должны указать форматирование. Вы посылаете в метку времени UNIX в DateTime, для этого:

$d1 = new DateTime($from_time); 
$d2 = new DateTime($to_time); 

Становится

$d1 = new DateTime('@'.$from_time); 
$d2 = new DateTime('@'.$to_time); 

Символ @ говорит DateTime, что я использую в Отметка времени Unix.

+0

Никогда не слышал об этом синтаксисе. это также приводит к фатальной ошибке. какая у вас версия PHP? Я имею 5.3.8 –

+0

Я использую 5.3.10. Какую ошибку он дает? – DanRedux

+0

Хорошо, ответ @Corbin на самом деле решил мою проблему. Ну, я использовал microtime (true) и сохранялся в переменной сеанса. объединение значения из переменной сеанса с знаком «@» вызвало ошибку. –

0

constructor for DateTime принимает строку как параметр, а не временную метку, поэтому вы видите «странное поведение».

Вы должны четко установить метку времени после того, как insantiating объект DateTime: -

$from_time = $_SESSION['startTime']; 
$d1 = new DateTime(); 
$d1->setTimestamp($from_time);