はじめに
PHP8上級試験では、日付操作やタイムゾーンの理解が問われることがあります。特に strtotime() 関数は便利ですが、タイムゾーン付きの文字列を渡した場合の挙動を正確に理解していないと、出力結果を間違える可能性があります。この記事では、strtotime() による変換の仕組みと date() での表示タイムゾーンの関係を、図解付きで解説します。
目次
サンプルコード
<?php
declare(strict_types=1);
error_reporting(-1);
$t = strtotime('Thursday, 26-Nov-2020 00:00:00 GMT+0900');
date_default_timezone_set('Asia/Tokyo');
echo date(DATE_ATOM, $t);出力結果
2020-11-26T00:00:00+09:00解説
1. strtotime() は UTC でタイムスタンプを作る
文字列 'Thursday, 26-Nov-2020 00:00:00 GMT+0900' を strtotime() に渡すと、まず タイムゾーンを考慮して UTC に変換 されます。
文字列: 2020-11-26 00:00:00 GMT+0900
↓ GMT+0900 = UTC+9
UTCタイムスタンプ: 2020-11-25 15:00:002. date() はデフォルトタイムゾーンで表示
date_default_timezone_set('Asia/Tokyo') を設定しているため、date() で出力すると UTC に 9時間を足して表示されます。
UTCタイムスタンプ: 2020-11-25 15:00:00
Asia/Tokyo (+09:00): 2020-11-26 00:00:00ASCIIタイムラインでイメージ
[文字列の時間] 2020-11-26 00:00:00 GMT+0900
|
v strtotime() -> Unixタイムスタンプ (UTC)
[UTC時間] 2020-11-25 15:00:00
|
v date() + Asia/Tokyo
[表示結果] 2020-11-26 00:00:00+09:00- タイムゾーン情報がある文字列は
strtotime()が優先 date()は PHP のデフォルトタイムゾーンを使って出力- 結果として、文字列で指定した時間と同じ時間が Asia/Tokyo 表示で得られる
まとめ
strtotime()は文字列のタイムゾーンを尊重して UTC に変換date()はdate_default_timezone_set()のタイムゾーンで表示- 文字列に
GMT+0900があれば、結果はAsia/Tokyoと一致して見える - この知識は PHP8上級試験でのタイムゾーン関連問題に直結
