날짜/시간 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