記事最終更新日:2017年08月20日
記事投稿日:2017年05月26日
閲覧数:2818 views
DateTimeの使い方メモ -【PHP】
 
 
はじめに
今回のD.M.C.【デベメモドットコム】の記事は「DateTimeの使い方メモ」ということで、PHPの日付処理に関するDateTimeクラスの使い方を詳しくメモ(解説)していきたいと思います。
タイムゾーン設定
DateTimeクラスは日付をオブジェクトとして扱うクラスです。
他の日付関数では問題となっている2038年の問題もDateTimeクラスを使用すれば気にせずに使用する事が出来ます。
まず初めにtimezone設定を行います。
日本時刻を扱う際は、php.iniに下記のように記述してください。
date.timezone = "Asia/Tokyo";
直接設定ファイルを修正出来ない場合は、下記のようにします。
<?php
    date_default_timezone_set('Asia/Tokyo');
    echo date_default_timezone_get();
またDateTimeクラスを使用する際に設定する事も出来ます。
<?php
    $datetime = new DateTime('Asia/Tokyo');
    $timezone = $date->getTimezone();
    echo $timezone->getName();
または一度インスタンス化してから設定する事も出来ます。
<?php
    $datetime = new DateTime();
    $datetime->setTimeZone(new DateTimeZone('Asia/Tokyo'));
    $timezone = $date->getTimezone();
    echo $timezone->getName();
基本的な使い方
まず基本的な使い方を見ていきましょう。
下記はnewでオブジェクト生成時にデフォルトのnowが適用されて現在日時が自動的にセットされ変数datetimeに代入しています。
そしてechoで出力をする際にDateTimeオブジェクトのformatメソッドを使用して出力形式を整えています。
<?php
    $datetime = new DateTime();
    echo $datetime->format('Y-m-d H:i:s');
フォーマット形式も色々と指定出来ます。
<?php
    $datetime = new DateTime();
    echo $datetime->format('Y年m月d日');
    echo $datetime->format('Y年m月d日 H時i分s秒');
    echo $datetime->format('Y-m-d H:i:s');
そして時間をあらかじめ指定して生成する事も出来ます。
任意文字列で指定する際は下記のようにします。
この時-ハイフンや/スラッシュは使用できますが年月日の日本語では生成する事が出来ないので、注意してください。
<?php
    $datetime = new DateTime('2017-01-17 17:17:17');
    echo $datetime->format('Y-m-d H:i:s');
任意数値を指定する際は下記のようにします。
<?php
    $datetime = new DateTime();
    $datetime->setDate(2017, 1, 17);
    echo $datetime->format('Y-m-d');
また細かく時間・分・秒を指定する際は下記のようにします。
<?php
    $datetime = new DateTime();
    $datetime->setDate(2017, 1, 17)->setTime(17, 17, 17);
    echo $datetime->format('Y-m-d H:i:s');
タイムスタンプを取得する
タイムスタンプを取得する際は下記のようにします。
<?php
    $datetime = new DateTime();
    echo $datetime->getTimestamp();
基準値から相対的に日時を作成する
基準値から相対的に日時を作成する際は下記のように指定する事もできます。
<?php
    $datetime = new DateTime('+1hours');
作成後にmodifyメソッドを使用して設定する事もできます。
どちらも現在日時から1時間後の相対値になっています。
<?php
    $datetime = new DateTime();
    $datetime->modify('+1 hours');
    echo $datetime->format('Y-m-d H:i:s');
日付の差を計算する
日付の差を計算したい場合はdiffメソッドを使用します。
この際の返り値はDateIntervalオブジェクトになります。
<?php
    $datetime1 = new DateTime('2017-01-17');
    $datetime2 = new DateTime('2017-01-20');
    $diff      = $datetime1->diff($datetime2);
    echo $diff->format('%R %y年 %mヶ月 %d日 %h時間 %i分 %s秒');
日付から加算を行いたい場合はaddメソッドを使用して下記のようにします。
下記の内容は2017年5月10日から1年と1日加算した例です。
<?php
    $datetime = new DateTime();
    $datetime->setDate(2017, 5, 10);
    $datetime->add(new DateInterval('P1Y1D'));
    echo $datetime->format('Y-m-d');
また日付から加減を行うsubメソッドを使用して下記のようにします。
下記の内容は2017年5月10日から1年と1日加減した例です。
<?php
    $datetime = new DateTime();
    $datetime->setDate(2017, 5, 10);
    $datetime->sub(new DateInterval('P1Y1D'));
    echo $datetime->format('Y-m-d');
年月日のフォーマットを指定する際は初めにPをつけてから続けて各フォーマット文字を指定します。
そして時分秒の場合は初めにTをつけてから続けてこちらも各フォーマット文字を指定します。
<?php
    $datetime = new DateTime();
    $datetime->setDate(2017, 1, 17)->setTime(17, 17, 17);
    $datetime->add(new DateInterval('P3Y7MT2H30M'));
    echo $datetime->format('Y年m月d日 H時i分s秒');
フォーマット一覧
| フォーマット | 例 | 説明 | 
|---|---|---|
| Y | 2017 | 西暦4桁 | 
| y | 17 | 西暦2桁 | 
| m | 01~12 | ゼロあり月 | 
| n | 1~12 | ゼロなし月 | 
| F | January | 英語表記月 | 
| M | Jan | 英語表記省略月 | 
| t | 28~31 | 指定した月の日数 | 
| d | 01~31 | ゼロあり日 | 
| j | 1~31 | ゼロなし日 | 
| l | Monday | 英語表記日 | 
| D | Mon | 英語表記省略日 | 
| N | 1(月曜)~ 7(日曜) | 曜日ISO-8601形式の曜日番号 | 
| w | 0(日曜)~ 6(土曜) | 曜日番号 | 
| z | 0~365 | 年間通算日(0から) | 
| h | 01~12 | 12時間単位 | 
| H | 00~23 | 24時間単位 | 
| g | 1~12 | 12までの時間 | 
| G | 0~23 | 24までの時間 | 
| i | 00~59 | 分 | 
| s | 00~59 | 分 | 
| A | AM PM | 午前/午後 | 
| a | am pm | 午前/午後 | 
| e | UTC | タイムゾーン | 
| O | +0900 | グリニッジ標準時(GMT)との差 | 
| P | +09:00 | グリニッジ標準時(GMT)時差間 | 
| Z | -43200~43200 | タイムゾーンオフセット秒数 | 
| c | 2011-06-30T10:15:00+0900 | ISO8601形式の日付 | 
| r | Thu,30 June 2011 10:15:00+0900 | RFC2822形式の日付 | 
| U | 1274461920 | タイムスタンプ | 
| W | 42 | 経過週 | 
| L | 潤年 | 01 | 
| Y | P1Y | 年 | 
| M | P1M | 月 | 
| D | P1D | 日 | 
| W | P1W | 週 | 
| H | T1H | 時間 | 
| M | T1M | 分 | 
| S | T1S | 秒 | 
| %Y,%y | 年 | 
|---|---|
| %M,%m | 月 | 
| %D,%d | 日 | 
| %a | 総日数 | 
| %H,%h | 時間 | 
| %I,%i | 分 | 
| %S,%s | 秒 | 
| %R,%r | 負数は「-]、正数は「+」 | 
| +1 sec +1 second +1 seconds | 1秒後 | 
| -1 sec -1 second -1 seconds | 1秒前 | 
| +1 min +1 mins +1 minute +1 minutes | 1分後 | 
| -1 min -1 mins -1 minute -1 minutes | 1分前 | 
| +1 hour +1 hours | 1時間後 | 
| -1 hour -1 hours | 1時間前 | 
| +1 week +1 weeks | 1週間後 | 
| -1 week -1 weeks | 1週間前 | 
| +1 month +1 months | 1ヶ月後 | 
| -1 month -1 months | 1ヶ月前 | 
| +1 year +1 years | 1年後 | 
| -1 year -1 years | 1年前 | 
感想
今回の記事はいかがだったでしょうか?PHPに限らず日付処理は絶対に必要になってくると思いますし、言語によって多少の違いはあると思いますが、今回紹介できてよかったと思います。
では最後まで見ていただき、ありがとうございました。
About / ブログについて
 
D.M.C.【デベメモドットコム】はWEB制作に関することを中心に、
その他、関連する事まで出来るだけわかりやすく備忘録としてメモを残していくブログです。
このブログを通して少しでも為になる情報を発信して皆さんと共有できればとても嬉しいです。
 
 
