PHP-дата-время

$currentDT = new \DateTime(); $filterRange = new \DateInterval('PT30S'); $filterDate = $currentDT->sub($filterRange); var_dump($currentDT); var_dump($filterDate); 

ВЫВОД:

 object(DateTime)[246] public 'date' => string '2011-12-10 15:53:42' (length=19) public 'timezone_type' => int 3 public 'timezone' => string 'America/New_York' (length=16) object(DateTime)[246] public 'date' => string '2011-12-10 15:53:42' (length=19) public 'timezone_type' => int 3 public 'timezone' => string 'America/New_York' (length=16) 

$ currentDT и $ filterDate одинаковы … хотя они должны быть 30 с разными. Любая идея почему?

Это ожидаемое поведение, вычитание действует на исходный объект, который затем возвращается. Это можно увидеть 246 в var_dump() , обозначая, что это один и тот же объект.

Если вы хотите сохранить оригинальный объект нетронутым, вам нужно будет clone его, прежде чем делать вычитание.

 $currentDT = new \DateTime('2011-12-13 14:15:16'); $filterRange = new \DateInterval('PT30S'); $filterDate = clone $currentDT; $filterDate->sub($filterRange); var_dump($currentDT, $filterDate); 

DateTime::sub изменяет дату в текущем объекте и возвращает ее копию для цепочки методов. Итак, в вашем примере вы меняете дату обоих объектов, поэтому оба будут установлены на 30 секунд назад.

Попробуйте это – он использует два отдельно инициализированных объекта для сравнения:

 $current1 = new \DateTime(); $current2 = new \DateTime(); $filterRange = new \DateInterval('PT30S'); $current2->sub($filterRange); var_dump($current1); // Should return the current time var_dump($current2); // Should return the current time - 30 seconds 

или, как указывает @salathe, используйте ключевое слово clone .

Единственный способ пойти – клонирование вместо создания 2 последовательных isntances of datetime, потому что есть вероятность, что instance1 и instance2 не будут равны в зависимости от скорости обработки сервера.