>백엔드 개발 >PHP 튜토리얼 >월을 추가할 때 PHP의 DateTime::modify가 예기치 않게 동작하는 이유는 무엇입니까?

월을 추가할 때 PHP의 DateTime::modify가 예기치 않게 동작하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-05 20:28:14570검색

Why Does PHP's DateTime::modify Behave Unexpectedly When Adding Months?

PHP DateTime::modify: 월 덧셈과 뺄셈의 복잡성>

날짜와 수정자를 다룰 때 PHP DateTime 클래스는 우리의 기대와 항상 일치하지 않을 수도 있는 독특한 행동을 나타냅니다. 일반적인 시나리오 중 하나는 월을 추가하는 것과 관련이 있으며 처음에는 클래스 처리가 직관적이지 않을 수 있습니다.

존재하지 않는 버그의 미스터리

다음 코드 조각을 고려하세요. :

$date = new DateTime('2000-12-31');

$date->modify('+1 month');
echo $date->format('Y-m-d') . "\n";

$date->modify('+1 month');
echo $date->format('Y-m-d') . "\n";

코드가 날짜를 다음 날짜로 앞당길 것으로 예상한다면 다음 달 1일과 그 후속인 경우 놀라운 결과를 만나게 됩니다.

2001-01-31
2001-03-03

예상된 2001-02-01 대신 2001-01-31이 표시됩니다. 왜 이런 일이 발생합니까?

Internal Mechanisms at Play

DateTime 클래스는 내부 날짜 형식을 고려하는 방식으로 월 추가를 처리합니다. 12월 31일에 한 달을 더하면 내부 날짜는 2001-02-31이 됩니다. 그러나 달력에 따르면 2001년 2월은 28일밖에 없으므로 PHP는 자동으로 3월 3일로 조정됩니다.

이것은 버그가 아니라 날짜가 항상 유효한 범위 내에 있도록 의도된 동작입니다.

정확한 월을 위한 우아한 솔루션 추가

PHP의 기본 동작이 항상 이상적인 것은 아니지만 이를 조정할 수 있는 우아한 솔루션이 있습니다.

수동 개입:

확인 다음 달에 올바른 일수를 수동으로 추가하여 원하는 날짜로 진행하세요. date.

PHP 5.3의 "첫 번째 날" 수정자:

PHP 5.3 이상의 경우 "첫 번째 날" 수정자를 사용하여 다음으로 진행할 수 있습니다. 다음 달 1일:

$d = new DateTime( '2010-01-31' );
$d->modify( 'first day of next month' );
echo $d->format( 'F' ), "\n"; // Outputs "February"

위 내용은 월을 추가할 때 PHP의 DateTime::modify가 예기치 않게 동작하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.