《PHP8上級試験対策》strtotimeで英文日付をUnixタイムスタンプに変換する仕組みとタイムゾーン挙動

  • URLをコピーしました!

はじめに

PHP8上級試験では、日付操作やタイムゾーンの理解が問われることがあります。特に strtotime() 関数は便利ですが、タイムゾーン付きの文字列を渡した場合の挙動を正確に理解していないと、出力結果を間違える可能性があります。この記事では、strtotime() による変換の仕組みと date() での表示タイムゾーンの関係を、図解付きで解説します。

キーワード: strtotime / Unixタイムスタンプ / タイムゾーン / date関数 / DATE_ATOM

目次

サンプルコード

<?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上級試験でのタイムゾーン関連問題に直結

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次