Ответ 1
$date1 = new DateTime();
$date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));
Update:
Если вы хотите скопировать, а не ссылаться на существующий объект DT, используйте clone
, а не =
.
$a = clone $b;
$date1 = $date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));
Теперь $date1
и $date2
содержат ту же дату - через три года. Я хотел бы создать два отдельных периода времени, один из которых анализируется из строки и один с тремя годами, добавленными к нему. В настоящее время я взломал это следующим образом:
$date2 = new DateTime($date1->format(DateTime::ISO8601));
но это кажется ужасным взломом. Есть ли "правильный" способ глубокой копии объекта DateTime?
$date1 = new DateTime();
$date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));
Update:
Если вы хотите скопировать, а не ссылаться на существующий объект DT, используйте clone
, а не =
.
$a = clone $b;
Клонирование даты с помощью оператора clone:
$date1 = new DateTime();
$date2 = clone $date1;
$date2->add(new DateInterval('P3Y'));
Клоны по умолчанию мелкие, но достаточно глубокие для DateTime. В ваших собственных объектах вы можете определить магический метод __clone()
для клонирования свойств (то есть дочерних объектов), которые имеют смысл клонировать, когда родительский объект изменяется.
(Я не уверен, почему документация считает хорошим примером необходимости клонирования объекта GTK. Кто использует GTK в PHP?)
PHP 5.5.0 представил DateTimeImmutable. методы добавления и изменения этого класса возвращают новые объекты.
$date1 = new DateTimeImmutable();
$date2 = $date1->add(new DateInterval('P3Y'));
$date1 = new DateTime();
$date2 = (clone $date1)->modify('+3 years');
(мелкая копия смеется - глубокое копирование DateTime не имеет (в настоящее время) никакого смысла)
clone
делает обычную мелкую копию - для этого случая достаточно (почему => см. ниже)()
оценивает выражение, возвращающее вновь созданный объект, по clone
->modify()
и модифицирует новый объектDateTime::modify(...)
документы:
Возвращает объект DateTime для цепочки методов или FALSE при ошибке.
$date2
теперь содержит только что созданный & измененный клон/копия, в то время как $date1
остается неизменным
Глубокое копирование/клонирование необходимо только тогда, когда вам нужно скопировать цели свойств, которые являются ссылками, но это:
class TestDateTime extends DateTime{
public function test(){
//*this* way also outputs private variables if any...
var_dump( get_object_vars($this) );
}
}
$test = (new TestDateTime())->test();
выходы:
array(3) {
["date"]=>
string(26) "2019-08-21 11:38:48.760390"
["timezone_type"]=>
int(3)
["timezone"]=>
string(3) "UTC"
}
поэтому нет ссылок, просто простые типы => нет необходимости глубокого копирования.
Вы должны изменить свой DateTime
на DateTimeImmutable
// from date time
$date = \DateTimeImmutable::createFromMutable($mutableDate)
то вы можете вызвать любой метод на DateTime
, не беспокоясь об этом.