WordPressでの現在日時取得はdate_i18n()を使う

WordPressで(現在)日時を取得しようとして date() を利用すると UTC で返ってきていつも「えぇ?」となるので備忘録として残しときます。

WordPress の wp-load.php が存在するディレクトリ上に次のコードを置いて実行してみると以下のように返ってきます。

<?php
echo date_default_timezone_get() ."\n";
echo date("Y-m-d H:i:s") ."\n";

require "wp-load.php";
echo date_default_timezone_get() ."\n";
echo date("Y-m-d H:i:s") ."\n";
Asia/Tokyo
2013-06-04 11:53:28
UTC
2013-06-04 02:53:28

wp-load.php を通すと wp-config.php を経由してインクルードされる wp-settings.php にて、

// WordPress calculates offsets from UTC.
date_default_timezone_set( 'UTC' );

と定義されている都合から、time()date() といったPHP標準の日時関連の関数は UTC で値を返してきます。

ぐぐるとよく、wp-settings.php の date_default_timezone_set('UTC') の引数を ‘Asia/Tokyo’ に置き換えるとOK みたいな記述を見かけるのですが、wp-settings.php は WordPress をバーションアップした際に置き換わる対象に含まれるファイルなので、うっかりバージョンアップしたが最期、大惨事!!になりがちです。

あるいはdate()time() を使う前に逐次 date_default_timezone_set( 'Asia/Tokyo' );……というのもあまりに冗長で賛同できないところ。

WordPress にはローカル日時を扱う関数がちゃんと用意されているので、そちらを利用します。それが date_i18n()

関数リファレンス/date i18n – WordPress Codex 日本語版によると、第3引数にGMTに変換するかのパラメータ(真偽値)を設定できる以外はPHP標準の date() と同じなので、使い方自体に困ることはないと思います。前のサンプルに手を加えて、

<?php
echo date_default_timezone_get() ."\n";
echo date("Y-m-d H:i:s") ."\n";

require "wp-load.php";
echo date_default_timezone_get() ."\n";
echo date("Y-m-d H:i:s") ."\n";

echo date_default_timezone_get() ."\n";
echo date_i18n("Y-m-d H:i:s") ."\n";

実行してみると……

Asia/Tokyo
2013-06-04 11:53:28
UTC
2013-06-04 02:53:28
UTC
2013-06-04 11:53:28

と、timezone は変更されないままローカル日時が返ってきます。

なお、WordPress 上でローカル日時のUnixタイムスタンプの値が欲しい場合は

date_i18n("U");

または

current_time("timestamp");

で取得できます。

参照URL