$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 не будут равны в зависимости от скорости обработки сервера.