
DateInterval 클래스는 년, 월, 주, 일, 시, 분, 초로 측정된 시간 간격을 나타내는 객체를 만드는 데 사용된다.
DateTime 객체의 add()와 sub() 메서드는 DateInterval 객체를 사용하여 현재 날짜/시간에 추가 또는 제거할 시간 간격을 지정한다.
각 간격 앞에 문자 P가 있으며, 시간의 간격 앞에는 문자 T가 있다.
- 1년 : P1Y
- 2개월 : P2M
- 3일 : P3D
- 1년, 2개월, 3일 : P1Y2M3D
- 1시간 : PT1H
- 30분 : PT30M
- 15초 : PT15S
- 1시간, 30분, 15초 : PT1H30M15S
- 1년, 1일, 1시간, 30분 : P1Y1DT1H30M
$interval = new DateInterval('P1M');
DateTime 객체의 diff() 메서드는 두 개의 DateTime 객체를 비교하여 객체 간의 간격을 나타내는 DateInterval 객체를 반환한다.
DateInterval 객체에 저장된 간격을 표시하려면, 해당 객체의 format() 메서드를 사용한다. 이 메서드의 인수는 간격을 표시하는 다음 표의 형식 문자를 사용하는 문자열이다.
- %y : 년
- %m : 월
- %d : 일
- %h : 시
- %i : 분
- %s : 초
- %f : 마이크로초
$interval->format('%h hours %i minutes');
예시)
<?php $today = new DateTime(); $event = new DateTime('2025-12-31 20:30'); $countdown = $today->diff($event); $earlybird = new DateTime(); $interval = new DateInterval('P1M'); $earlybird->add($interval); ?> <?php include 'includes/header.php'; ?> <p><b>Countdown to event:</b><br> <?= $countdown->format('%y years %m months %d days') ?></p> <p><b>50% off tickets bought by:</b><br> <?= $earlybird->format('D d M Y, g:i a')?></p> <?php include 'includes/footer.php'; ?>
결과)

DatePeriod 클래스는 시작 날짜와 종료 날짜 사이의 일정한 간격이 발생하는 DateTime 객체의 집합을 저장하는 객체를 생성할 수 있다. 그러면 생성한 각 DateTime 객체에 대한 루프를 돌 수 있다.
DatePeriod 객체를 생성하려면 시작 날짜, 이벤트의 주기, 기간의 종료 날짜 세 가지가 필요하다.
날짜 기간의 종료 날짜는 DateTime 객체, 또는 이벤트가 시작 날짜 이후로 몇 번 발생해야 하는지를 나타내는 정수 중 하나일 수 있다.
DatePeriod 객체가 생성되면, 그 객체는 일련의 DateTime 객체를 갖게 된다. 각 객체는 DateInterval 객체에 지정된 간격으로 시작 날짜와 종료 날짜 사이의 시점을 나타낸다.
$period = new DatePeriod($start, $interval, $end);
foreach 루프를 사용하여 DatePeriod 객체의 각 DateTime 객체에 접근할 수 있다.
모든 루프와 마찬가지로, 루프를 통해 접근되는 각 DateTime 객체를 변수명을 사용하여 저장할 수 있다.
코드 블록에서 DateTime 객체의 메서드를 사용하여 해당 날짜/시간으로 작업할 수 있다.
foreach($period as $occurrence) { echo $occurrence->format('Y jS F'); }
DateTime 객체를 생성할 때 타임존을 지정할 수 있다. 이것은 DateTimeZone 클래스를 사용하여 생성된 객체를 통해 표현된다.
DateTimeZone 클래스는 타임존을 나타내는 객체를 생성한다. 객체는 해당 타임존에 대한 정보를 저장한다.
괄호 안에 IANA 타임존을 사용하여 타임존을 지정한다.
DateTime 객체를 생성할 때 이 객체를 사용하면 타임존을 지정할 수 있으며 일관 절약 시간(서머타임)을 제어할 수도 있다.
$tz_LDN = new DateTimeZone('Europe/London'); $LDN = new DateTime('now', $tz_LDN);
- getName() : 이 타임존의 이름을 반환한다.
- getLocation() : 다음의 정보를 포함하는 인덱스 배열을 반환한다.
키 : 값
country_code : 국가에 대한 짧은 코드
latitude : 이 위치의 위도
longitude : 이 위치의 경도
comments : 이 위치에 대한 모든 주석- getOffset() : 이 타임존의 UTC 오프셋을 초 단위로 반환한다. (UTC는 GMT와 같은 시간이지만, 이것이 표준이며 국가/영토에 얽매이지 않는다)
- getTransitions() : 주어진 시간대에서 일광 절양 시간제가 적용될 때를 가리키는 배열을 반환한다.
예시)
<?php $tz_LDN = new DateTimeZone('Europe/London'); $tz_TYO = new DateTimeZone('Asia/Tokyo'); $location = $tz_LDN->getLocation(); $LDN = new DateTime('now', $tz_LDN); $TYO = new DateTime('now', $tz_TYO); $SYD = new DateTime('now', new DateTimeZone('Australia/Sydney')); ?> <?php include 'includes/header.php'; ?> <p> <b>LDN: <?= $LDN->format('g:i a') ?></b> (<?= ($LDN->getOffset() / (60 * 60)) ?>)<br> <b>TYO: <?= $TYO->format('g:i a') ?></b> (<?= ($TYO->getOffset() / (60 * 60)) ?>)<br> <b>SYD: <?= $SYD->format('g:i a') ?></b> (<?= ($SYD->getOffset() / (60 * 60)) ?>)<br> </p> <h1>Head Office</h1> <p> <?= $tz_LDN->getName() ?><br> <b>Longitude: </b> <?= $location['longitude'] ?><br> <b>Latitude: </b> <?= $location['latitude'] ?> </p> <?php include 'includes/footer.php'; ?>
결과)

출처 - 존 두켓, <백엔드 프로그래밍을 위한 PHP & MySQL>, Jpub, 2022