날짜 & 시간(3)

minah moon·2023년 8월 18일

PHP

목록 보기
33/58
post-thumbnail

DateInterval을 사용하여 간격 나타내기

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를 사용하는 반복 이벤트

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');
}

DateTimeZone을 사용하여 타임존 관리하기

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

0개의 댓글