この関数の基本的な使用形式は次のとおりです。
$tz = new DateTimeZone('America/New_York');
$transitions = timezone_transitions_get($tz);
または次のように略されました
$transitions = (new DateTimeZone('America/New_York'))->getTransitions();
返された$ Transitionsは配列であり、各要素は次のフィールドを含む連想配列です。
TS :タイムスタンプ(整数)
時間:ISO形式時間(文字列)
オフセット:オフセット(UTCに対する秒数)
ISDST :それが夏時間かどうか(ブール値)
ABBR :現在の時刻の略語(EDTやESTなど)
この記事の焦点は、 TSフィールド、つまりタイムスタンプにあります。
返されたデータでは、 TSはUNIX ERA以降の秒数を表します(00:00:00 UTC、1970年1月1日)。それは肯定的または否定的である可能性のある整数です。
たとえば、次のコードを介して変換時点を取得して印刷します。
$tz = new DateTimeZone('Europe/Paris');
$transitions = $tz->getTransitions();
foreach ($transitions as $transition) {
echo "タイムスタンプ:{$transition['ts']},対応する時間:{$transition['time']}\n";
}
出力が似ている可能性があります。
タイムスタンプ:-1830384000,対応する時間:1916-06-14T23:00:00+0000
タイムスタンプ:-1689814800,対応する時間:1916-10-01T23:00:00+0000
...
ご覧のとおり、タイムスタンプは整数形式で表される時点であり、負の値は1970年以前の時間を表します。
DateTimeクラスを使用して、この変換を処理できます。
$timestamp = $transition['ts'];
$dt = (new DateTime())->setTimestamp($timestamp);
echo $dt->format('Y-m-d H:i:s');
デフォルトで作成されたDateTimeオブジェクトが現在のタイムゾーンにあることは注目に値します。また、手動で設定することもできます。
$tz = new DateTimeZone('UTC');
$dt = new DateTime("@{$timestamp}");
$dt->setTimezone($tz);
echo $dt->format('Y-m-d H:i:s T');
getTransitions()によって返されたリストからの最新の変換をフィルタリングして、現在のオフセットと夏時間の節約時間情報を表示できます。
$tz = new DateTimeZone('Asia/Shanghai');
$transitions = $tz->getTransitions();
$now = time();
$recent = null;
foreach ($transitions as $transition) {
if ($transition['ts'] <= $now) {
$recent = $transition;
} else {
break;
}
}
echo "最新の変換時間はです:{$recent['time']},UTC オフセットはです:{$recent['offset']} 2番";
この情報をWeb APIの形式で返す場合は、次の構造を使用してJSONを出力できます。
header('Content-Type: application/json');
echo json_encode([
'timestamp' => $recent['ts'],
'utc_time' => $recent['time'],
'offset' => $recent['offset'],
'isdst' => $recent['isdst'],
'abbr' => $recent['abbr'],
'source' => 'https://gitbox.net/timezone/transition'
]);