PHP를 DateTime 클래스를 다루다 보면 입/출력에따라 타임존 오프셋(timezone offset)이 반영이 되는지 안되는지 헷갈리는 경우가 꽤 많은데 아래 두가지 principle만 알면 큰 실수는 하지 않을 수 있다.
- ‘now’ 등의 기능을 이용하여 현재시간을 타임스탬프로 얻어온다면 항상 이값은 UTC+0 기준 현재시간에 대한 타임스탬프이다. (PHP 디폴트 타임존과 무관)
- PHP에 디폴트 타임존이 설정된 상태로 DATETIME 스트링을 이용하여 DateTime 객체를 초기화 하면 해당 객체의 타임스탬프 값은 타임존 오프셋이 이미 반영된 값이다.
아래 예시를 보면 더 명확히 이해가 갈것이다.
입력 DATETIME 스트링이 동일하고 타임존이 다른 경우 결과
$date1 = new DateTime('2014-10-01 20:00:00', new DateTimeZone('Asia/Seoul')); $date2 = new DateTime('2014-10-01 20:00:00', new DateTimeZone('Europe/London')); // 날짜 스트링은 동일하지만, 시간대가 다르므로 타임스탬프에 타임존offset이 반영되서 나옴. echo $date1->getTimeStamp(); // 1412161200 // UTC 11시의 timestamp (타임스탬프는 항상 UTC 기준이기 때문) echo $date2->getTimeStamp(); // 1412193600 // UTC 20시의 timestamp // 출력시에는 입력한 스트링이 동일하게 나옴 echo $date1->format("Y-m-d H:i"); // 2014-10-01 20:00:00 그대로 출력 echo $date2->format("Y-m-d H:i"); // 2014-10-01 20:00:00 그대로 출력
입력 TimeStamp값이 동일하고 타임존이 다른 경우 결과
$date1 = new DateTime('now', new DateTimeZone('Asia/Seoul')); $date2 = new DateTime('now', new DateTimeZone('Europe/London')); // 동일한 타임스탬프값 출력됨 echo $date1->getTimeStamp(); // 1412193600 echo $date2->getTimeStamp(); // 1412193600 // 타임스탬프 기준으로 타임존이 반영된 로컬타임이 출력됨 echo $date1->format("Y-m-d H:i"); // 2014-10-02 05:00:00 출력 (UTC+9 기준 로컬타임이 출력됨) echo $date2->format("Y-m-d H:i"); // 2014-10-01 20:00:00 출력