SOFTELメモ Developer's blog

[php] タイムスタンプとタイムゾーン

2025/08/06 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

関連するメモ

コメント