Date Time 개체를 딥 복사하려면 어떻게 해야 합니까?
$date1 = $date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));
지금이다$date1그리고.$date2지금으로부터 3년 후의 날짜가 포함되어 있습니다.문자열에서 구문 분석된 데이터 타임과 3년이 추가된 데이터 타임 두 개를 만들고 싶습니다.현재는 이렇게 해킹하고 있습니다.
$date2 = new DateTime($date1->format(DateTime::ISO8601));
끔찍한 해킹으로 보이는데요Date Time 개체를 자세히 복사하는 "올바른" 방법이 있습니까?
$date1 = new DateTime();
$date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));
업데이트:
기존 DT 개체를 참조하지 않고 복사하려면clone,것은 아니다.=.
$a = clone $b;
복제 연산자를 사용하여 날짜를 복제합니다.
$date1 = new DateTime();
$date2 = clone $date1;
$date2->add(new DateInterval('P3Y'));
클론은 기본적으로 얕지만 DateTime에 충분히 깊이가 있습니다.독자적인 오브젝트에서는,__clone()상위 개체가 변경되었을 때 복제할 수 있는 속성(예: 하위 개체)을 복제하는 매직 메서드입니다.
(개체를 복제할 필요가 있는 좋은 예가 GTK인 이유는 잘 모르겠습니다.PHP에서 GTK를 사용하는 사용자)
PHP 5.5.0에서는 DateTimeImmptable이 도입되었습니다.이 클래스의 메서드를 추가 및 수정하면 새 개체가 반환됩니다.
$date1 = new DateTimeImmutable();
$date2 = $date1->add(new DateInterval('P3Y'));
TLDR(PHP 5.5+/7.0.0+/8.0.0+):
사용: 원래 인스턴스:-는 변경되지 않습니다.
<?php
$date1 = new DateTimeImmutable(); // Immutable => VERY IMPORTANT
$date2 = $date1->modify('+3years');
// see that $date1 still has the original year
echo $date1->format('Y-m-d H:i:s'); // outputs 2022-05-01 12:59:50
echo PHP_EOL;
echo $date2->format('Y-m-d H:i:s'); // outputs 2025-05-01 12:59:50
BTW: 를 사용하는 경우Carbon또한 있다
PHP 문서: https://www.php.net/manual/en/class.datetimeimmutable.php
심플하게 :)
오래된 답변(다시 쓰기) (더 이상 추천하지 않음!) :
이전에는 얕은 복사로도 충분했습니다.Date Time 인스턴스를 쉽게 조사하여 값에 따라 복사되는 단순한 유형(참조가 없음)만 있는 것을 알 수 있었기 때문에 Date Time의 딥 복사에는 의미가 없었습니다.
그러나 다음 코드는 PHP7.4에서 작동하지 않습니다(향후 솔루션은 Reflection 클래스/오브젝트 근처가 될 가능성이 높습니다).
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변화할 염려 없이
언급URL : https://stackoverflow.com/questions/2579458/how-do-i-deep-copy-a-datetime-object
'source' 카테고리의 다른 글
| 두 표의 점수를 비교하여 가장 최근의 점수가 다른 부분을 보여줍니다. (0) | 2022.12.24 |
|---|---|
| EX를 반환해야 합니까?IT_SUCCESS 또는 main()의 0? (0) | 2022.12.24 |
| Laravel의 ORM을 사용하여 결과를 "제한"할 수 있는 방법이 있습니까? (0) | 2022.12.24 |
| 다중 케이스 스테이트먼트 전환 (0) | 2022.12.24 |
| Java에서 열거할 Int를 캐스트합니다. (0) | 2022.12.24 |