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 の
みたいな記述を見かけるのですが、wp-settings.php は WordPress をバーションアップした際に置き換わる対象に含まれるファイルなので、うっかりバージョンアップしたが最期、大惨事!!になりがちです。date_default_timezone_set('UTC')
の引数を ‘Asia/Tokyo’ に置き換えるとOK
あるいは
……というのもあまりに冗長で賛同できないところ。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");
で取得できます。