記事一覧

PHPで日付・時刻を操作する - チートシート

アイキャッチ

目次


PHPで日付や時刻を操作するには、何を使えばいいのか?

ハローみなさん、エジソンです。

PHPには、その歴史ゆえ古いAPIから新しいAPIが乱立しており、日付や時刻を操作することを一つとってみても、色々な方法があり、何を使っていいのか迷いがちです。

古いAPIの筆頭候補として、date関数などが有名だったりします。

しかし、date関数は、動詞+名詞のような組み合わせの名前ではないので、何をしてくれるAPIなのか名前から推測することはできません。

そこで、僕はPHPで最も新しい日付・時刻を操作するAPIである、 DateTime の利用をお奨めしたいです。

後発で登場した、DateTimeを使うことで、メソッドの名前からどのような処理を行っているか推察することができ、見通しの良いコードを書けるのではないかと思います。

ちなみに、DateTimeクラスは、PHP 5.20以上で利用可能です。現時点で、 PHP 5.20 ならまず間違いなくレンタルサーバーなどのサービスにおいて、サポートされているバージョンかと思います。

日付・時刻を扱う

以下に、DateTimeを用いた、日付と時刻に関する、APIの使用例を掲載しました。

ポイントは、DateTimeオブジェクトから任意のフォーマットで文字列に変換する、

DateTime->format

と、任意のフォーマットの文字列から、DateTimeオブジェクトに変換する、

DateTime->createFromFormat

メソッドでしょうか。さらに、加算と減算には、

DateTime->add
DateTime->sub

を利用します。加算と減算値は、DateTimeIntervalオブジェクトで表現されます。

以上を踏まえて、以下のコードをご覧ください。

チートコード
<?php

        /*
         * 現在日時を取得する
         */
        $now = new \DateTime();
        echo '現在日時: ' . $now->format('Y/m/d H:i:s.u') . PHP_EOL;


        /*
         * 現在日時を取得する(マイクロ秒あり)
         */
        // DateTimeオブジェクトの通常の生成ではマイクロ秒を取得できないため
        // microtime経由でDateTimeオブジェクトを生成する
        // DateTimeオブジェクトに変換する
        $now = \DateTime::createFromFormat('U.u', sprintf('%6F', microtime(true)));

        echo '現在日時(マイクロ秒あり)' . $now->format('Y/m/d H:i:s.u') . PHP_EOL;
        
        // DateIntervalのコンストラクタの第1引数は文字列を指定
        // 最初は必ずPを指定。10Dの場合は、10日という意味。
        // Y	年
        // M	月
        // D	日
        // W	週。日付に変換されるので D と組み合わせて使うことはできません。
        // H	時間
        // M	分
        // S	秒

        /*
         * 年の加算
         */
        $now = new \DateTime();
        $nowDayAdd = $now->add(new \DateInterval('P5Y'));
        echo '年の加算: ' . $nowDayAdd->format('Y/m/d H:i:s.u') . PHP_EOL;
        
        /*
         * 年の減算
         */
        $now = new \DateTime();
        $nowDayAdd = $now->sub(new \DateInterval('P5Y'));
        echo '年の減算: ' . $nowDayAdd->format('Y/m/d H:i:s.u') . PHP_EOL;
        
        /*
         * 月の加算
         */
        $now = new \DateTime();
        $nowDayAdd = $now->add(new \DateInterval('P5M'));
        echo '月の加算: ' . $nowDayAdd->format('Y/m/d H:i:s.u') . PHP_EOL;
        
        /*
         * 月の減算
         */
        $now = new \DateTime();
        $nowDayAdd = $now->sub(new \DateInterval('P5M'));
        echo '月の減算: ' . $nowDayAdd->format('Y/m/d H:i:s.u') . PHP_EOL;
        
        /*
         * 日付の加算
         */
        $now = new \DateTime();
        $nowDayAdd = $now->add(new \DateInterval('P5D'));
        echo '日の加算: ' . $nowDayAdd->format('Y/m/d H:i:s.u') . PHP_EOL;
        
        /*
         * 日付の減算
         */
        $now = new \DateTime();
        $nowDayAdd = $now->sub(new \DateInterval('P5D'));
        echo '日の減算: ' . $nowDayAdd->format('Y/m/d H:i:s.u') . PHP_EOL;
        
        /*
         * 時の加算
         */
        $now = new \DateTime();
        $nowDayAdd = $now->add(new \DateInterval('PT5H'));
        echo '時の加算: ' . $nowDayAdd->format('Y/m/d H:i:s.u') . PHP_EOL;
        
        /*
         * 時の減算
         */
        $now = new \DateTime();
        $nowDayAdd = $now->sub(new \DateInterval('PT5H'));
        echo '時の減算: ' . $nowDayAdd->format('Y/m/d H:i:s.u') . PHP_EOL;
        
        /*
         * 分の加算
         */
        $now = new \DateTime();
        $nowDayAdd = $now->add(new \DateInterval('PT5M'));
        echo '分の加算: ' . $nowDayAdd->format('Y/m/d H:i:s.u') . PHP_EOL;
        
        /*
         * 分の減算
         */
        $now = new \DateTime();
        $nowDayAdd = $now->sub(new \DateInterval('PT5M'));
        echo '分の減算: ' . $nowDayAdd->format('Y/m/d H:i:s.u') . PHP_EOL;
        
        /*
         * 秒の加算
         */
        $now = new \DateTime();
        $nowDayAdd = $now->add(new \DateInterval('PT5S'));
        echo '秒の加算: ' . $nowDayAdd->format('Y/m/d H:i:s.u') . PHP_EOL;
        
        /*
         * 秒の減算
         */
        $now = new \DateTime();
        $nowDayAdd = $now->sub(new \DateInterval('PT5S'));
        echo '秒の減算: ' . $nowDayAdd->format('Y/m/d H:i:s.u') . PHP_EOL;
        
        /*
         * 複数の単位で加算
         */
        $now = new \DateTime();
        $nowDayAdd = $now->add(new \DateInterval('P1Y2M3DT4H5M6S'));
        echo '複数の単位で加算: ' . $nowDayAdd->format('Y/m/d H:i:s.u') . PHP_EOL;
        
        /*
         * 複数の単位で減算
         */
        $now = new \DateTime();
        $nowDayAdd = $now->sub(new \DateInterval('P1Y2M3DT4H5M6S'));
        echo '複数の単位で減算: ' . $nowDayAdd->format('Y/m/d H:i:s.u') . PHP_EOL;
?>

上記のコードを実行すると、以下のような結果が出力されます。

現在日時: 2015/10/11 07:24:39.000000
現在日時(マイクロ秒あり)2015/10/11 07:24:39.446907
年の加算: 2020/10/11 07:24:39.000000
年の減算: 2010/10/11 07:24:39.000000
月の加算: 2016/03/11 07:24:39.000000
月の減算: 2015/05/11 07:24:39.000000
日の加算: 2015/10/16 07:24:39.000000
日の減算: 2015/10/06 07:24:39.000000
時の加算: 2015/10/11 12:24:39.000000
時の減算: 2015/10/11 02:24:39.000000
分の加算: 2015/10/11 07:29:39.000000
分の減算: 2015/10/11 07:19:39.000000
秒の加算: 2015/10/11 07:24:44.000000
秒の減算: 2015/10/11 07:24:34.000000
複数の単位で加算: 2016/12/14 11:29:45.000000
複数の単位で減算: 2014/08/08 03:19:33.000000
参考
PHP公式 - DateTimeクラス
PHP公式 - DateTimeIntervalクラス
関連記事

このエントリーをはてなブックマークに追加

コメント

コメントの投稿

非公開コメント

プロフィール

EZOLABブログへようこそ。
EZOLABは、札幌のソフトウェア会社です。

http://ezolab.co.jp