DateTime オブジェクトのタイムゾーンの設定

タイムゾーンを特に指定しない場合、 date_default_timezone_get() の値が使われる。

<?php
$date = new DateTime;

$tz = $date->getTimezone();
$tz->getName(); // Asia/Tokyo
date_default_timezone_get(); // Asia/Tokyo

$date->getTimestamp(); // 1410130800
$date->format('Y/m/d H:i:s'); // 2014/09/08 08:00:00

@ + UNIX タイムスタンプで初期化した場合

DateTime クラスのコンストラクタに、'@' + UNIX タイムスタンプ という文字列を指定した場合、そのオブジェクトのタイムゾーンは強制的に UTC となる。

<?php
$date = new DateTime('@1410130800');

$tz = $date->getTimezone();
$tz->getName(); // +00:00
$date->getTimestamp(); // 1410130800
$date->format('Y/m/d H:i:s'); // 2014/09/07 23:00:00

一方 setTimestamp() でタイムスタンプを指定した場合は、そのオブジェクトが持っているタイムスタンプが受け継がれる。

<?php
$date = new DateTime;
$date->setTimestamp(1410130800);

$tz = $date->getTimezone();
$tz->getName(); // Asia/Tokyo
$date->getTimestamp(); // 1410130800
$date->format('Y/m/d H:i:s'); // 2014/09/08 08:00:00

ある地域の時刻を別の地域の時刻に変換する

変換元のタイムゾーンを指定してから時刻を表す文字列を解析し、変換先のタイムゾーンを指定して整形関数を使えばよい。

<?php
$date = new DateTime('2014/09/08 08:00:00', new DateTimeZone('Europe/London'));
$date->format('Y/m/d H:i:s'); // 2014/09/08 08:00:00

$date->setTimezone(new DateTimeZone('UTC'));
$date->format('Y/m/d H:i:s'); // 2014/09/08 07:00:00 (夏時間のためロンドンの時刻は UTC より 1 時間進んでいる)