날짜/시간 Date/Time Arithmetic
다음 예는 DST 전환 및 일 수가 다른 월과 관련된 날짜/시간 산술의 몇 가지 함정을 보여줍니다.
예제 #1 DateTimeImmutable::add/sub 경과 시간을 포함하는 간격 추가
DST 전환을 통해 PT24H를 추가하면 23/25시간이 추가되는 것으로 나타납니다(대부분의 시간대).
<?php
$dt = new DateTimeImmutable("2015-11-01 00:00:00", new DateTimeZone("America/New_York"));
echo "Start: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->add(new DateInterval("PT3H"));
echo "End: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
?>
위의 예는 다음을 출력합니다.
Start: 2015-11-01 00:00:00 -04:00 End: 2015-11-01 02:00:00 -05:00
예제 #2 DateTimeImmutable::modify 및 strtotime 개별 구성 요소 값 증가 또는 감소
DST 전환에 +24시간을 추가하면 날짜/시간 문자열에 표시된 대로 정확히 24시간이 추가됩니다(시작 또는 종료 시간이 전환 지점에 있는 경우 제외).
<?php
$dt = new DateTimeImmutable("2015-11-01 00:00:00", new DateTimeZone("America/New_York"));
echo "Start: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+24 hours");
echo "End: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
?>
위의 예는 다음을 출력합니다.
Start: 2015-11-01 00:00:00 -04:00 End: 2015-11-02 00:00:00 -05:00
예제 #3 시간을 더하거나 빼면 날짜가 초과되거나 줄어들 수 있습니다.
예를 들어 1월 31일 + 1개월은 3월 2일(윤년) 또는 3일(평년)이 됩니다.
<?php
echo "Normal year:\n"; // February has 28 days
$dt = new DateTimeImmutable("2015-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Start: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+1 month");
echo "End: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
echo "Leap year:\n"; // February has 29 days
$dt = new DateTimeImmutable("2016-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Start: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+1 month");
echo "End: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
?>
위의 예는 다음을 출력합니다.
Normal year: Start: 2015-01-31 00:00:00 -05:00 End: 2015-03-03 00:00:00 -05:00 Leap year: Start: 2016-01-31 00:00:00 -05:00 End: 2016-03-02 00:00:00 -05:00
다음 달의 마지막 날을 가져오기 위해(즉, 오버플로 방지를 위해) 형식의 마지막 날을 사용할 수 있습니다.
<?php
echo "Normal year:\n"; // February has 28 days
$dt = new DateTimeImmutable("2015-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Start: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("last day of next month");
echo "End: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
echo "Leap year:\n"; // February has 29 days
$dt = new DateTimeImmutable("2016-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Start: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("last day of next month");
echo "End: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
?>
위의 예는 다음을 출력합니다.
Normal year: Start: 2015-01-31 00:00:00 -05:00 End: 2015-02-28 00:00:00 -05:00 Leap year: Start: 2016-01-31 00:00:00 -05:00 End: 2016-02-29 00:00:00 -05:00