この記事は最後に更新してから1年以上経過しています。

5.3の新機能:日付とタイムゾーン

説明

WordPress 5.3 Beta 1」に記載されていた「Time/Date component fixes」という見出し。開発者向として新しい関数の追加や多くのバグが修正されたとなっており、チェックせざるを得ない。

タイムゾーンの取得

はじめに、この記事は公開された5.3 Beta2をもとにしており、正式リリースの際に変更される可能性があることを予めお断りする。

5.3では日付・時刻に関連する関数がいくつか追加されているが、まずは wp_timezone_string関数を紹介しよう。wp_timezone_string関数は、管理ページの「設定(Settings)」-「一般(General)」で確認・更新できる内容を取得する。保存されているタイムゾーンの生データは、都市名の場合とUTCからのオフセット時間の場合があり、それぞれ異なるオプション名を使って get_option関数で取得できる。

// 都市名
$timezone_string = get_option( 'timezone_string' );

// オフセット時間
$offset  = (float) get_option( 'gmt_offset' );

都市名が保存されている場合はオフセット時間が空となり、逆にオフセット時間が保存されている場合は都市名が空となる。都市名であればサマータイムを考慮した日付・時刻管理となるが、オフセット時間の場合はサマータームは考慮されないところが大きく異なる。なおwp_timezone_string関数ではオフセット時間が設定されている場合、get_option関数で取得した値を、'+09:00'のような書式に加工した文字列を返すようになっている。

実際にテーマやプラグインでタイムゾーン情報が必要になった場合、wp_timezone_string関数ではなく、 wp_timezone関数を使用することになる。それはwp_timezone関数では内部では、wp_timezone_string関数でサイトのタイムゾーン情報を取得し、それを使って(PHPの)DateTimeZoneオブジェクトを生成して返り値とするためだ。

サイトの日付・時刻の取得

現在の日時を取得する関数として、新たに current_datetime関数が追加されている。これはサイトのタイムゾーンを考慮したものとなる。

$datetime = current_datetime();

この関数の返り値は、PHPのDateTimeImmutableオブジェクトとなる。先ほど取得した変数$datetimeをダンプすると、日時のほかにタイムゾーン情報を保持していることがわかる。

object(DateTimeImmutable)#552 (3) {
  ["date"]=>
  string(26) "2019-10-02 13:31:51.730688"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(10) "Asia/Tokyo"
}

DateTimeImmutableオブジェクトはいくつかのメソッドを提供している(詳しくはPHPマニュアル参照)。現在の日時をフォーマットを指定して出力する場合は次のような記述となる。

$datetime = current_datetime();
echo esc_html( $datetime->format( 'Y-m-d H:i' ) );

出力内容は次の通り。

2019-10-02 13:35

汎用的な日付・時刻の取得

current_datetime関数は現在の日時を取得する場合に使用する関数だが、汎用性の高い wp_date関数も追加されている。

string | false = wp_date( string $format [ , int $timestamp = null [ , DateTimeZone $timezone = null ] ] )

第2パラメータの$timestampを指定することで任意の日時を、第3パラメータの$timezoneを指定することでサイトとは異なるタイムゾーンを適用できるようになっているのが特徴である。

まずはシンプルな使い方。現在の日時をwp_date関数を使って出力してみる。

echo esc_html( wp_date( 'Y-m-d H:i' ) );

出力内容はcurrent_datetime関数と同等で次のようになる。

2019-10-02 13:44

今度はタイムゾーンを「デトロイト」に変更してみる。

echo esc_html( wp_date( 'Y-m-d H:i', null, new DateTimeZone( 'America/Detroit' ) ) );

出力内容は次の通りで、時刻の部分が変わっていることがわかる。

2019-10-02 00:45

なお、既存の date_i18n関数は内部でwp_date関数を使用するように一部修正されている。

おまけ

日付・時刻に関連するものとして、最後に human_time_diff関数についてふれる。この関数はこれまで1分以内の違いを'1 min'のように分単位で出力していたが、5.3.0では1分未満の違いを秒で出力するように変わっている。

echo esc_html( human_time_diff( time()-2, time() ) );

この出力内容は次ようになる。

2 seconds

最終更新 : 2019年10月02日 14:12


お勧め

get_the_title(2018年5月27日 更新)

string get_the_title( [ int $id = 0 ] )
投稿データのタイトルを取得する。

get_archives_link(2019年5月9日 更新)

string get_archives_link( string $url, string $text [ , string $format = 'html' [ , string $before = '' [ , string $after = '' [ , bool $selected = false ] ] ] ] )
アーカイブページのリンクテキストを取得する。

load_textdomain(2018年5月27日 更新)

bool load_textdomain( string $domain, string $mofile )
国際化用ファイル(MOファイル)をロードする。

is_404(2018年5月27日 更新)

bool is_404( )
要求されているページが、404ページ(投稿データが見つからない)か調べる。

term_description(2018年1月22日 更新)

string term_description( [ int $term = 0 [ , string $taxonomy = 'post_tag' $deprecated = null ] ] )
タームの説明文を取得する。