
【PHP】DateTimeクラスで日時計算とフォーマットを行う方法
- Tips
- PHP
- プログラミング
- 日付計算
よくある簡単な日付計算の方法
date関数とstrtotime関数
PHPでの日付の扱いは何と言ってもdate関数がとても簡単ですね。
さらに、strtotime関数も合わせて使用することで日時の計算が行えます。
このあたりはWEBを検索しているとさまざまなサイトで出てくるよくあるtipsですね。関数を利用してごく簡単に実装できるため、一般的なやり方となっているようです。
実はPHPは他のやり方を推奨している!?
「PHP 日付計算」などと検索するとほとんどの上記のようなやり方をしているサイトが結構出てきますよね。しかし!PHPマニュアルを読んでいると以下のような一文が!
--
この関数を使って日付の足し算や引き算を行うことはおすすめできません。 PHP 5.3 以降なら DateTime::add() や DateTime::sub() を、そして PHP 5.2 なら DateTime::modify() を使いましょう。
--
なんということでしょう、現在PHPの公式マニュアルではstrtotime関数によるタイムスタンプの変換を推奨していません。代わりにDateTimeクラスを利用することをお勧めしています。
明確な理由はわかりませんが、おそらく2038年問題に対応するための勧告だと思われます。一応64bit版ならば事実上無制限に日付を扱えるはずですが、日時を扱うクラスを用意したんだからそっち使ってよってことですかね。
DateTimeクラスでの日時計算とフォーマット
DateTimeオブジェクト
まずは基本となるDateTimeクラス。名前の通り、日時を扱うためのクラスです。
(クラスリファレンス:http://php.net/manual/ja/class.datetime.php)
try {
作成方法は初期化パラメータに日付型書式の文字列を与えるだけです。
$date = new DateTime('2000-01-01');
} catch (Exception $e) {
echo $e->getMessage();
}
日付型書式はstrtotime関数同様、日付と時刻の書式を利用できます。
DateTime::add()とDateTime::sub()による日時計算
日時の加算、減算にはDateTime::add()、DateTime::sub()メソッドを利用します。
strtotime関数の時には相対書式の文字列が引数でしたが、DateTime::add()メソッド引数がDateInterval型のオブジェクトとなっている点に注意が必要です。
try {
このDateIntervalクラスの初期化パラメータはISO 8601 duration specificationに基づくフォーマットで指定する必要があるのですが、いまいち直感的ではありません。
$date = new DateTime('2000-01-01');
$date->add(new DateInterval('P10D'));
} catch (Exception $e) {
echo $e->getMessage();
}
そこで、DateInterval::createFromDateString()メソッドを利用して相対書式からDateIntervalオブジェクトを生成することができます。
try {
これで使用感的にはstrtotime関数と同じ指定ができます。
$date = new DateTime('2000-01-01');
$date->add(DateInterval::createFromDateString('1 day'));
} catch (Exception $e) {
echo $e->getMessage();
}
DateTime::format()による書式指定
日時のフォーマットを行うDateTime::format()メソッドの引数はdate関数と同じ書式指定を与えることでフォーマットされた文字列を返却します。
try {
date関数と同じ引数を設定するだけなので使用感は変わりませんね。
$date = new DateTime('2000-01-01');
echo $date->format('Y年m月d日');
} catch (Exception $e) {
echo $e->getMessage();
}