PHP дата и время выпуска - PullRequest
1 голос
/ 11 декабря 2011
$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 с. Есть идеи почему?

Ответы [ 3 ]

7 голосов
/ 11 декабря 2011

Это ожидаемое поведение, вычитание действует на исходный объект, который затем возвращается. Это видно по 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);
0 голосов
/ 07 октября 2016

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

0 голосов
/ 11 декабря 2011

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, конечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...