[php] タイムスタンプとタイムゾーン
雑に扱うと1日ずれるなどのトラップを発動する、タイムスタンプとタイムゾーン。
タイムスタンプ
タイムスタンプそのものはタイムゾーンの影響を受けない。
世界標準時で 1970年1月1日 00:00:00 UTC からの経過秒数。
date関数
date('Y-m-d', タイムスタンプ) はタイムゾーンの設定の影響を受ける。
渡されたタイムスタンプ(UTC)が、実行中のphpのタイムゾーンで何年何月何日何時何分何秒の表記になるか計算する。
日本時間で
date_default_timezone_set('Asia/Tokyo');
var_dump(date_default_timezone_get(), date('Y-m-d H:i:s', 1754233200));
string(10) "Asia/Tokyo"
string(19) "2025-08-04 00:00:00"
世界標準時で
date_default_timezone_set('UTC');
var_dump(date_default_timezone_get(), date('Y-m-d H:i:s', 1754233200));
string(3) "UTC"
string(19) "2025-08-03 15:00:00"
strtotime関数
strtotime関数は、パラメータによってタイムゾーンの影響を受ける。
パースしてもらう文字列にタイムゾーンの情報が入っていれば使えるのだが、タイムゾーンの情報が入っていない YYYY-mm-dd などを渡されると、今設定されているタイムゾーンでの時刻としてタイムスタンプにされる。
設定に依存しない動作が必要な場合は、タイムゾーンも渡すのがよさそう。
例)
タイムゾーンあり '2025-08-04 09:00:00 JST' → 1754265600
タイムゾーンあり '2025-08-04 09:00:00 UTC' → 1754298000
タイムゾーンあり '2025-08-04 09:00:00 +0900' → 1754265600
タイムゾーンあり '2025-08-04 09:00:00 -06:00' → 1754319600
タイムゾーンあり '2025-08-04 09:00:00 Europe/Amsterdam' → 1754290800
タイムゾーンなし '2025-08-04'
→ 日本時間設定のphpでは 1754233200、UTC設定では 1754265600
タイムゾーンなし '2025-08-04 09:00:00'
→ 日本時間設定のphpでは 1754265600、UTC設定では 1754298000