PHPでの日時の設定/変換/比較等

  • PHP
  • 現在地

今回は、タイムスタンプや条件として利用するために、日時の操作を行ってみたのでこれについて記述しておきます。

なお、ここで記述してあるのは、DateTime クラスを利用したオブジェクト型での方法です。

DateTime / 日時を表すクラス

まずは、日時を表す DateTime クラスをオブジェクトとするために実体化します。(引数は省略可)

  • $date = new DateTime('日時', タイムゾーン);
  1. 日時の部分は、有効な書式で記述された文字列でないと解釈してくれません。省略した場合、現時刻が指定されます。
    外部リンク
  2. タイムゾーンの部分は、DateTimeZone クラスを実体化し、下記のようにオブジェクトとして指定する必要があります。
    $date = new DateTime(null,new DateTimeZone('Asia/Tokyo'));
    なお、省略した場合、php.ini の date.timezone の値がタイムゾーンに指定されます。

    なので、あらかじめ date.timezone の値を書き換えておけば、タイムゾーンの指定は省略可能になります。

ちなみに、DateTime オブジェクトの中身を print_r() で確認してみると、以下のようになっています。(引数省略時)

  • DateTime Object
  • (
    • [date] => 2012-08-01 04:49:14
    • [timezone_type] => 3
    • [timezone] => Europe/Berlin
  • )

他に DateTime オブジェクトの作成は、DateTime クラスの createFromFormat() メソッドでも可能です。

  • $date2 = DateTime::createFromFormat('U',time());

引数は書式と日時なのですが、第1引数の書式は第2因数の日時を解析するためのものです。

なお第3引数にタイムゾーンを指定できますが、タイムスタンプの場合は無視されるので省略しています。

日時の操作

  • 日時とタイムゾーンの設定

    ここでは DateTime オブジェクト作成後に、日時やタイムゾーンを設定し直す場合に利用できるメソッドについて記述しておきます。

    まずタイムゾーンについては、setTimezone() で DateTimeZone オブジェクトを指定し設定できます。

    次に日時は、setDate() で日付を、setTime() で時刻を設定することができ、または setTimestamp() で UNIXタイムスタンプによる設定をすることができます。

    例として、日本時間で2012年07月28日 05時00分00秒に設定する場合。

    • <?php
      • $date = new DateTime();
      • $date->setTimezone(new DateTimeZone('Asia/Tokyo'));
      // これら3つの構文はすべて同じ日時を指定しています。
      • $date->setDate(2012,7,28);
      • $date->setTime(5,0,0);
      // ISO日付による設定
      • $date->setISODate(2012,30,6);
      • $date->setTime(5,0,0);
      // タイムスタンプでの設定
      • $date->setTimestamp(1343419200);
    • ?>

    また、setISODate(年,週(,日)) メソッドでも日付の設定が行え、第3引数は省略した場合 1 が入り、その週の月曜日が指定されます。

  • 日時を指定した書式(フォーマット)に変換する

    DateTime オブジェクトに格納された日時は、format('書式') で指定した書式に変換して返すことができます。

    • echo $date->format(DATE_ATOM)."\n";
    • echo $date->format('Y年m月d日 H時i分s秒');

    echo で出力してみると、上は "Y-m-d\TH:i:sP" が書式となり、下は記述した書式通りに同じ時刻を出力します。(DATE_ATOM の部分は、DateTime::ATOM でも可能です。)

    なお、DATE_ATOMのような書式用の定数については、マニュアルの PHP: DateTime - Manual で確認して下さい。

    タイムスタンプに変換する場合は、getTimeStamp() でも可能です。(引数無し)

  • 日時に変更を加える

    日時を変更する場合は、modify() で加算・減算が行えます。

    • $date->modify('-1 year -1 month -1 week -1 day -1 hours -1 minute -1 second');

    すべてマイナスを指定しているため、それぞれ減算された日時がオブジェクトに格納されることになりますが、加算する場合は、プラスを指定するか省略してください。

    この他に add() で加算を、sub() で減算を、DateInterval オブジェクトを引数とすることで行うこともできます。

  • 日時の比較と差

    日時を比較する場合、DateTime オブジェクト同士の場合は、変数をそのまま比較演算子で比較することができます。

    一方がオブジェクトでない場合は、どちらもタイムスタンプの書式に変換して比較する必要があります。

    ただし、日時の差を求める場合は diff(比較対象) メソッドから DateInterval オブジェクトが返されるので、これを取得します。

    DateInterval クラスは日数や年数等の日時の間隔を表すクラスです。

    // 差を出力する一例
    • echo $date->diff($date2)->format('%r%a');

    この例では $date と $date2 の差を diff メソッドで求め、DateIntervall::format メソッドで日数の差を出力します。

    書式の文字は、'%' と組み合わせないとただの文字列とされます。詳しくは PHP: DateInterval::format - Manual で参照。

    なお、日数の差だけを表示したい場合は DateIntervall::days プロパティでも表すことはできます。

  • タイムゾーンの情報を取得する

    DateTime オブジェクトのタイムゾーンに関する情報は、getTimezone() により DateTimeZone オブジェクトが返り値となるので、ここから取得することができます。

    • $tz = $date->getTimezone();
    • // 位置情報
      $tl = $tz->getLocation();
    • echo '国コード:'.$tl['country_code']."\n緯度:".$tl['latitude']."\n経度:".$tl['longitude'];
    • // タイムゾーン名
      echo 'タイムゾーン:'.$tz->getName();

    /* 結果
    • 国コード:JP
    • 緯度:35.65444
    • 経度:139.74472
    • タイムゾーン名:Asia/Tokyo
    */

    ちなみに DateTimeZone::listIdentifiers() を print_r() で出力させることで、全てのタイムゾーン識別子名を確認することができたりします。

スポンサードリンク

inserted by FC2 system