神戸のホームページ制作会社、有限会社ユニファース 代表のブログ

WordPressでunixtimeと日時を相互変換する方法(wp_date・current_datetime)

WordPress 5.3 で日時まわりの仕組みが見直され、日時の取得や変換には wp_date() と current_datetime() を使うよう案内されています。date_i18n() や current_time( 'timestamp' ) は互換性のために残されていますが、新しく書くコードでは使わないほうが安全です。

この記事では、よく使う「現在の日時の取得」と「unixtime と日時の相互変換」を、実際に動かした結果とあわせてまとめます。例は、サイトのタイムゾーンを「東京(Asia/Tokyo)」にしている場合です。

1.現在のunixtimeを取得する

unixtime は世界共通の値で、タイムゾーンの影響を受けません。time() で十分です。

2.現在の日時(日本時間)を取得する

current_datetime() はサイトのタイムゾーンを持った DateTimeImmutable を返すので、「1日後」「月末」などの日付計算をするときに便利です。

3.unixtime から日時に変換する

第2引数に unixtime を渡すと、サイトのタイムゾーンの日時に変換されます。

4.日時から unixtime に変換する

WordPress には「日時を unixtime に戻す」専用の関数がありません。PHP の DateTime に、サイトのタイムゾーン(wp_timezone())を渡して変換します。

タイムゾーンを new DateTimeZone( 'Asia/Tokyo' ) と直接書いても同じ結果になります。wp_timezone() を使えば、管理画面でタイムゾーンを変えてもコードを直す必要がありません。

5.注意:date_i18n( ‘U’ ) や strtotime() は9時間ずれる

以前は、現在の unixtime を date_i18n( 'U' ) で取得しているコードをよく見かけました。これを置き換えようとして strtotime( wp_date( 'Y-m-d H:i:s' ) ) と書くと、たしかに同じ値になります。ただし、どちらも本来の unixtime より9時間(32400秒)進んだ値です。

WordPress は PHP のデフォルトのタイムゾーンを UTC に固定しています。そのため strtotime() は、日本時間の日時を UTC の日時として解釈してしまいます。

既存のコードがこの「9時間ずれた値」を前提に作られているなら、strtotime( wp_date( 'Y-m-d H:i:s' ) ) に置き換えても動作は変わりません。新しく書くコードでは、1〜4の方法で正しい unixtime を扱ってください。

記事一覧へ戻る