はじめに
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:00
2. 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:00
ASCIIタイムラインでイメージ
[文字列の時間] 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上級試験でのタイムゾーン関連問題に直結