「PHPで現在時刻を取得したい」
「PHPで日本時間を確実に表示したい」
「PHPのタイムゾーンがよくわからない・・・」
このような場合には、この記事の内容が参考となります。
この記事では、PHPで日本時間の現在時刻を表示する方法を解説しています。
具体的には、time関数とdate関数を中心とした説明です。
また、PHPのタイムゾーンについても説明しています。
本記事の内容
- time関数
- date関数
- PHPのタイムゾーン
- 【動作確認】タイムゾーン別現在時刻
それでは、上記に沿って解説していきます。
time関数
time関数は、現在時刻をUnix エポック (1970 年 1 月 1 日 00:00:00 GMT) からの通算秒として返します。
ポイントとして、Unixタイムスタンプにはタイムゾーンは無関係と言うことです。
唯一関係あるとしたら、グリニッジ標準時(GMT)です。
では、ここでtime()の返す値を確認しましょう。
1640043660
よく見るヤツです。
time関数が戻す値には、次の特徴があります。
- タイムゾーンは無関係(GMTベース)
- Unixエポック (1970 年 1 月 1 日 00:00:00 GMT) からの通算秒
以上、time関数の説明でした。
次は、date関数を確認します。
date関数
「ローカル」というワードに注目です。
これは、タイムゾーンが関係するということになります。
そして、date関数は日付・時刻の書式化を行うのです。
時刻(タイムスタンプ)を取得するなんて一言も書いていません。
date(string $format, ?int $timestamp = null): string
$formatには、書式を設定します。
$timestampには、Unixタイムスタンプを設定します。
そして、この$timestampは省略できます。
省略した場合は、time()の値がデフォルトで設定されます。
ここでdate関数の特徴をまとめておきます。
- タイムゾーンに依存する
- タイムスタンプを取得する機能はない(time関数の利用)
- 設定されたタイムスタンプの表示部分に関する機能を持つ
この特徴を意識して、次のコードを見てください。
echo date('Y年m月d日 H:i:s', time());
実行結果は、以下。
2021年12月21日 9:09:00
日本時間の現在時刻としては、正しい結果です。
でも、一つ疑問に感じませんか?
「タイムゾーン」に関する指定が、上記コードのどこにもありません。
それなのに、日本のタイムゾーンを適切に認識して処理しています。
このことを理解するには、PHPのタイムゾーンを理解しておく必要があります。
以上、date関数の説明でした。
次は、PHPのタイムゾーンを確認します。
PHPのタイムゾーン
まずは、date関数が日本時間の現在時刻を表示した理由を説明しましょう。
答えは、次の関数にあります。
date_default_timezone_get関数を実行してみましょう。
echo date_default_timezone_get();
結果は、以下。
おそらく、みなさんの環境でも「Asia/Tokyo」が表示されるはずです。
phpinfo()の結果でも、「Asia/Tokyo」を確認できます。
では、これはどこで設定されているのでしょうか?
通常は、php.iniで設定されています。
php.ini
[Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone = Asia/Tokyo
実は、設定されていない場合もあります。
その場合は、OSのタイムゾーンが適用されているはずです。
そのおかげで、php.iniの設定がなくてもセーフと言うのはありえます。
以上、PHPのタイムゾーンを説明しました。
次は、動作確認としてタイムゾーン別の現在日時の確認を行います。
【動作確認】タイムゾーン別現在時刻
タイムゾーンが異なれば、現在時刻も異なるはずです。
そこで、タイムゾーンをコード内で変更してその動作を確認します。
タイムゾーンを変更するには、次の関数を利用します。
この関数を利用しているのが、以下のコードです。
<?php $unitime = time(); dipslay_datetime($unitime, 'America/Los_Angeles'); dipslay_datetime($unitime, 'GMT'); dipslay_datetime($unitime, 'Asia/Tokyo'); function dipslay_datetime($unix_timestamp, $tz){ date_default_timezone_set($tz); $script_tz = date_default_timezone_get(); echo $script_tz; echo "<br />"; echo date('Y年m月d日 H:i:s', $unix_timestamp); echo "<hr />"; } ?>
dipslay_datetimeという関数を設けています。
内容は、説明する必要がないほど単純です。
そして、上記コードを実行した結果は以下となります。
この結果より、PHPのタイムゾーンが理解できます。
また、time関数とdate関数に関しても理解が進んだはずです。
以上、【動作確認】タイムゾーン別現在時刻の説明でした。