$date1 = $date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));
이제 $date1
와 $date2
현재로부터 3 년 – 같은 날짜가 포함되어 있습니다. 두 개의 개별 날짜 시간을 만들고 싶습니다. 하나는 문자열에서 구문 분석되고 다른 하나는 3 년이 추가되었습니다. 현재 나는 다음과 같이 해킹했습니다.
$date2 = new DateTime($date1->format(DateTime::ISO8601));
그러나 그것은 끔찍한 해킹처럼 보입니다. DateTime 개체를 자세히 복사하는 “올바른”방법이 있습니까?
답변
$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은 DateTimeImmutable을 도입했습니다 . 이 클래스의 추가 및 수정 메서드는 새 개체를 반환합니다.
$date1 = new DateTimeImmutable();
$date2 = $date1->add(new DateInterval('P3Y'));
답변
TLDR :
$date1 = new DateTime();
$date2 = (clone $date1)->modify('+3 years');
(Shallow copy is enaugh- Deep copy-ing DateTime is (current ) no sense )
그렇게 간단합니다 🙂
설명 “php create datetime object from another datetime”:
clone
키워드는 정기적으로 만드는 얕은의 사본을 – enaugh을이 경우에 (=> 아래 참조 이유)- 래핑
()
하면 새로 생성 된 객체를 반환하는 표현식이 다음과 같이 평가됩니다.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
변경에 대해 걱정하지 않고 모든 메서드를 호출 할 수 있습니다.
답변
