【date関数を使うとずれるので】WordPressで日時を扱うときは、この関数が便利でした

WordPressを使っていて、現在の日時を取得する機会がありました。例えば、どこかのAPI等を使ってデータを取得した日時をDBに格納する時などです。そこで、phpの「date関数」を使ってWordPress上で実行すると、値がUTC(協定世界時)で取得されます。具体的にどうなるか、試しました。

例:現在の日時を取得すると・・・9時間ずれてしまう

2013-12-2 15:56:43 //現在の日時
2013-12-2 06:56:43 //WordPress上で「date」関数を使った場合。UTCになってます

上記のように、WordPress上で「date」関数を使うと、9時間ずれて取得されます。また、php.iniファイルでタイムゾーンを東京「date.timezone = Asia/Tokyo」に指定済だとしても、だめなんですよねぇ。

タイムゾーンを設定しているのに、UTCになってしまう理由

WordPressを動かすために必要な「wp-settings.php」ファイルに以下の記述があります。

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

ここに書いてあるタイムゾーンの設定が、上書きしているんだと思います。「wp-settings.php」ファイルの改変はお勧めできないので、他の方法でやります。

対策:WordPressで日時を扱うには便利な関数があります

というわけで「date関数」の代わりに、WordPress側で用意されている「date_i18n関数」を使うことで回避できました。以下に概要をメモしましたので、興味がありましたらご参考ください。

「date_i18n」関数とは

Codexに説明が書かれていますので、引用しますと・・

タイムスタンプに基づいて、ローカライズされた書式で日付を取得する。

ロケールが月と週を指定している場合、日付にもその書式を適用します。そうでない場合、日付書式文字列が適用されます。

i18n は、Internationalization(最初の “i” と最後の “n” の間に 18 文字)=国際化を意味します。

なるほど~。早速試そう!

サンプルコード

date_i18n("Y-n-j H:i:s")

結果

2013-12-2 16:15:06

おお~。うまく現在の日時を取得できました。オプションなどの設定もできますので、詳細はCodexでご確認ください。

「date_default_timezone_set」でもタイムゾーンを設定できますが・・・

date_default_timezone_set関数」を使えばタイムゾーンを設定できます。

date_default_timezone_set('Asia/Tokyo');

この方法は、どうなんだろな~

PHPファイルごとに毎回指定する必要があるので、ちょっと面倒ですね。・・・「wp-settings.php」ファイルに書かれている設定が「UTC」なので、準拠したほうがいい気がします。WordPress専用の「date_i18n関数」も用意されていますしね。それに、タイムゾーンを変更してしまうと、予期せぬ動作をしてしまうかもしれないです。しないかもしれないけど。

予期せぬ動作がおこると不安なので、例えば「date_default_timezone_set関数」設定したタイムゾーンは後でUTCに戻さないといけないとか、そんな工程が増えるとやっぱりめんどうなので、ここはひとつ、「date_i18n関数」を使うと覚えてしまったほうが手っ取り早いように思っています。

著者:bouya Imamura