UPDATE:2019年06月24日
PHP で 日付 を計算する
日付を計算
時間の差を求める場合はこちらをお読みください。
php.ini に記述する場合
書式 strtotime()
指定日時のUNIXタイムスタンプ = strtotime('英文形式 OR 日付/時刻 フォーマット文字列');
//返り値は数値(int)、失敗時は FALSE を返す
strtotime() が理解できる英文形式フォーマット文字列
strtotime() が理解できる日付/時刻のフォーマット文字列
書式 mktime()
指定日時のUNIXタイムスタンプ = mktime(時, 分, 秒, 月, 日, 年);
//返り値は数値(int)、失敗時は FALSE を返す
書式 date()
日時の文字列 = date('日付/時刻フォーマット文字列' [,UNIXタイムスタンプ]);
//[ ]省略可(タイムスタンプがない場合現在日時となる)
//返り値は文字列(string)
date() が理解できる日付/時刻フォーマット文字列
書式 DateTimeクラス
オブジェクト = new DateTime(['英文形式 OR 日付/時刻のフォーマット文字列']);
//[ ]は省略可能です。
DateTimeクラス が理解できる英文形式フォーマット文字列
DateTimeクラス が理解できる日付/時刻のフォーマット文字列
DateTime format()メソッド が理解できるフォーマット文字列
サンプル
1 2 3 4 5 6 7 | <?php $date1 = '2019-05-01'; $date2 = '2019-06-19'; echo ((strtotime($date2) - strtotime($date1)) / 86400).'日'; //出力 49日 //秒数を86400で割ると日数になります ?> |
2つの日付の日数差を計算(日数のみ)
strtotime() で日数差を計算
strtotime()関数を使用して2つの日付の差を計算します。日付をタイムスタンプに変換し、それらの差を 86400 で割ると日数が出力されます。
strtotime()関数 は、「英文形式で指定された日付や時刻のフォーマット文字列」、または、「日付/時刻のフォーマット文字列」を読み込み、結果をUNIXタイムスタンプの数値として返します。
「 UNIXタイムスタンプ = strtotime('英文形式の日付/時刻フォーマット文字列'); 」
「 UNIXタイムスタンプ = strtotime('日付/時刻フォーマット文字列'); 」
strtotime() に指定する最も一般的な日時の書式は 日付:strtotime('2019-01-02')、日時:strtotime('2019-01-02 03:04:05') というような書式です。その他にも様々なフォーマットがあります。興味のある方は以下のページを参照下さい。
strtotime() が理解できる英文形式フォーマット文字列
strtotime() が理解できる日付/時刻のフォーマット文字列
1 2 3 4 5 6 7 8 9 | <?php //Day1 $date1 = '2019-05-01'; //Day2 $date2 = '2019-06-19'; //計算 echo ((strtotime($date2) - strtotime($date1)) / 86400).'日'; //出力 49日 ?> |
mktime() で日数差を計算
mktime()関数を使用して2つの日付の差を計算します。mktime()関数 は、指定した日時のUNIXタイムスタンプの数値を返します。時、分、秒、月、日、年 と日時の内容を指定します。書式は、mktime(時, 分, 秒, 月, 日, 年) となります。日付のみ指定する場合は、時/分/秒 を 0 にしておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php //Day1 $date1Y = '2019'; $date1M = '05'; $date1D = '01'; //Day2 $date2Y = '2019'; $date2M = '06'; $date2D = '19'; //計算 echo ((mktime(0,0,0,$date2M,$date2D,$date2Y) - mktime(0,0,0,$date1M,$date1D,$date1Y)) / 86400).'日'; //出力 49日 ?> |
DateTimeクラス で日数差を計算
DateTimeクラスで2つの日時の差を計算します。DateTimeクラスのdiff()メソッドを利用すれば、2つの日付の差を簡単に出力できます「 日付差のオブジェクト = 日付1オブジェクト->diff(日付2オブジェクト); 」。「年、月、日、時、分、秒」に分けて日付の差を出力できます。
「 オブジェクト = new DateTime('英文形式のフォーマット文字列'); 」。
日付や時刻の指定は日時の文字列でも指定可能です。例えば、DateTime('2019-01-02 03:04:05'); というような形です。
「 オブジェクト = new DateTime('ドは、指定した日付や時刻のフォーマット文日付/時刻のフォーマット文字列'); 」。
日時の指定を省略した場合は現在の日時になります。日時の指定には様々なフォーマットがありますので、興味のある方は以下のページを参照下さい。
DateTimeクラス が理解できる英文形式フォーマット文字列
DateTimeクラス が理解できる日付/時刻のフォーマット文字列
DateTimeクラスのformat()メソッドは、指定した日付や時刻のフォーマット文字列から日時の文字列を返します「 日時の文字列 = オブジェクト->format('日付/時刻のフォーマット文字列'); 」。成功すると日時の文字列を返し、失敗すると FALSE を返します。format()メソッドで指定する日時のフォーマット文字列はdate()関数で指定するフォーマットと同じです。
DateTime format()メソッド が理解できるフォーマット文字列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php //差を求める日時の変数を作成 $dateTime1 = '2019-05-01 12:00:00'; $dateTime2 = '2020-08-19 11:50:12'; //DateTimeクラスで2つの日時のオブジェクトを作成 $objDatetime1 = new DateTime($dateTime1); $objDatetime2 = new DateTime($dateTime2); //diff()メソッドで2つの日時のオブジェクトから //ふたつの日付の差をあらわす DateInterval オブジェクトを生成する $objInterval = $objDatetime1->diff($objDatetime2); //$objInterval(DateInterval オブジェクト)をformat()メソッドで日時を出力 //%Rは + や - の符号を出力するオプションです echo $objInterval->format('%R%Y').'年<br>'; //年 echo $objInterval->format('%R%M').'月<br>'; //月 echo $objInterval->format('%R%D').'日<br>'; //日 echo $objInterval->format('%R%H').'時<br>'; //時 echo $objInterval->format('%R%I').'分<br>'; //分 echo $objInterval->format('%R%S').'秒<br>'; //秒 ?> |
+03月
+17日
+23時
+50分
+12秒
2つの日時の差を計算(時間含める)
日数、時間、分、秒 の差
2つの日付を時間も含めた日時でその差を求める場合は、少し複雑になります。strtotime()関数を使用して日時の差を日数、時間、分、秒で出力する関数を作成してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | <?php //日数と時分秒の差を返す関数 function date_time_diff($d1, $d2){ //初期化 $diffDateTime = array(); //タイムスタンプ $timeStamp1 = strtotime($d1); $timeStamp2 = strtotime($d2); //タイムスタンプの差を計算 $difSeconds = $timeStamp2 - $timeStamp1; //秒の差を取得 $diffDateTime['seconds'] = $difSeconds % 60; //分の差を取得 $difMinutes = ($difSeconds - ($difSeconds % 60)) / 60; $diffDateTime['minutes'] = $difMinutes % 60; //時の差を取得 $difHours = ($difMinutes - ($difMinutes % 60)) / 60; $diffDateTime['hours'] = $difHours % 24; //日数の差を取得 $difDays = ($difHours - ($difHours % 24)) / 24; $diffDateTime['days'] = $difDays; //結果を返す return $diffDateTime; }//end function //差を求める日時 $dateTime1 = '2019-06-19 12:50:30'; $dateTime2 = '2019-12-21 23:56:12'; //配列初期化 $diffDateTimeOutPut = array(); //関数実行 $diffDateTimeOutPut = date_time_diff($dateTime1, $dateTime2); //日時の差を表示 echo $diffDateTimeOutPut['days'].'日<br>'; echo $diffDateTimeOutPut['hours'].'時間<br>'; echo $diffDateTimeOutPut['minutes'].'分<br>'; echo $diffDateTimeOutPut['seconds'].'秒<br>'; ?> |
11時間
5分
42秒
日付を加算する
現在から日付を加算する
日付を加算するには、タイムスタンプに必要な加算日数を加えて、加算後のタイプスタンプを date() で日付として出力します。タイムスタンプは strtotime() や mktime() で取得可能で、必要な日数を加算することも出来ます。
date() + strtotime() で現在から加算
今日から「+5日、+1週間(日数だと+7日間)、+2カ月、+3年」加算してみます。strtotime()関数 で今日から加算したタイムスタンプを取得し、date()関数 で日付の出力をします。
strtotime() で日付を加算する場合、英文形式「today +5 day +1 week +2 month +3 year」が利用できます。
実行日時:2019-01-01 00:00:00
1 | <?php echo date('Y/m/d',strtotime("today +5 day +1 week +2 month +3 year")); ?> |
※today は省略可能です。
結果は、
となります。
英文形式フォーマット文字列には様々なフォーマットがあります。興味のある方は以下のページを参照下さい。
- 「now(今)」
- 「today(本日)」
- 「tommorw(明日)」
- 「yesterday(昨日)」
- 「+1 day(1日後 -符号もOK)」
- 「+1 week(1週間後 -符号もOK)」
- 「+1 month(1カ月後 -符号もOK)」
- 「+1 year(1年後 -符号もOK)」
- 「+1 seconds(1秒後 -符号もOK)」
- 「+1 min(1分後 -符号もOK)」
- 「+1 hours(1時間後 -符号もOK)」
さらに詳細を知りたい方
strtotime() が理解できる英文形式フォーマット文字列
date() + mktime() で現在から加算
mktime()関数でもタイムスタンプを取得することが可能です。mktime() で今日から+5日、+1週間(日数だと+7日間)、+2カ月、+3年 加算してみます。
実行日時:2019-01-01 00:00:00
1 | <?php echo date('Y/m/d',mktime(0, 0, 0, date('m')+2, date('d')+12, date('Y')+3)); ?> |
結果は、
となります。
DateTimeクラス で現在から加算
DateTimeクラス は英文形式フォーマット文字列が理解できるので、加算する内容を英文形式で指定します。
実行日時:2019-01-01 00:00:00
1 2 3 4 | <?php $objDateTime = new DateTime('today +5 day +1 week +2 month +3 year'); echo $objDateTime->format('Y/m/d'); ?> |
※today は省略可能です。
結果は、
となります。
DateTimeクラスに指定する英文形式フォーマット文字列にも、様々なフォーマットがあります。興味のある方は以下のページを参照下さい。
- 「now(今)」
- 「today(本日)」
- 「tommorw(明日)」
- 「yesterday(昨日)」
- 「+1 day(1日後 -符号もOK)」
- 「+1 week(1週間後 -符号もOK)」
- 「+1 month(1カ月後 -符号もOK)」
- 「+1 year(1年後 -符号もOK)」
- 「+1 seconds(1秒後 -符号もOK)」
- 「+1 min(1分後 -符号もOK)」
- 「+1 hours(1時間後 -符号もOK)」
さらに詳細を知りたい方
DateTimeクラス が理解できる英文形式フォーマット文字列
任意の日から日付を加算する
date() + strtotime() で任意の日付から加算
任意の日付から「+5日、+1週間(日数だと+7日間)、+2カ月、+3年」加算します。任意の日付を指定し、さらに、加算する内容を英文形式フォーマットで指定します。
「 UNIXタイムスタンプ = strtotime('日付/時刻フォーマット文字列 英文形式の日付/時刻フォーマット文字列'); 」
の形式で指定します。
任意の日付:2020-01-01
1 | <?php echo date('Y/m/d',strtotime("2020-01-01 +5 day +1 week +2 month +3 year")); ?> |
結果は、
となります。
例では「2020-01-01」形式の日付フォーマットですが、strtotime()は以下のような日付フォーマットも扱えます。
- 「02-01-2020(日-月-年)」
- 「02.01.2020(日.月.年)」
- 「01/02/20(月/日/年)」
- 「20-01-02(年-月-日)」
- 「01/02/2020(月/日/年)」
- 「Jan. 02, 2020(3文字英語月. 日, 年)」
- 「02 Jan 2020(日 3文字英語月 年)」
さらに詳細を知りたい方
strtotime() が理解できる日付/時刻のフォーマット文字列
date() + mktime() で任意の日付から加算
mktime() で任意の日付から加算します。mktime(時, 分, 秒, 月, 日, 年) に任意の日付を指定し、加算する内容を記述します。
任意の日付:2020-01-01
1 | <?php echo date('Y/m/d',mktime(0, 0, 0, 1+2, 1+12, 2020+3)); ?> |
結果は、
となります。
DateTimeクラス で任意の日付から加算
任意の日付から「+5日、+1週間(日数だと+7日間)、+2カ月、+3年」加算します。任意の日付を指定し、さらに、加算する内容を英文形式フォーマットで指定します。
「 オブジェクト = new DateTime('日付/時刻フォーマット文字列 英文形式の日付/時刻フォーマット文字列'); 」
任意の日付:2020-01-01
1 2 3 4 | <?php $objDateTime = new DateTime('2020-01-01 +5 day +1 week +2 month +3 year'); echo $objDateTime->format('Y/m/d'); ?> |
結果は、
となります。
例では「2020-01-01」形式の日付フォーマットですが、DateTimeクラスは以下のような日付フォーマットも扱えます。
- 「02-01-2020(日-月-年)」
- 「02.01.2020(日.月.年)」
- 「01/02/20(月/日/年)」
- 「20-01-02(年-月-日)」
- 「01/02/2020(月/日/年)」
- 「Jan. 02, 2020(3文字英語月. 日, 年)」
- 「02 Jan 2020(日 3文字英語月 年)」
さらに詳細を知りたい方
DateTimeクラス が理解できる日付/時刻のフォーマット文字列
日付を減算する
日付を減算するには、加算時の「+」符号を「-」符号に変更することで計算できます。
現在から日付を減算する
今日から -5日、-1週間、-2カ月、-3年 減算してみます。加算の場合は + の符号ですが、 – 符号にすれば減算できます。
date() + strtotime() で現在から減算
現在から -5日、-1週間、-2カ月、-3年 減算
実行日:2019-01-01
1 | <?php echo date('Y/m/d',strtotime("today -5 day -1 week -2 month -3 year")); ?> |
※today は省略可能です。
結果は、
となります。
date() + mktime() で現在から減算
現在から -5日、-1週間、-2カ月、-3年 減算
実行日:2019-01-01
1 | <?php echo date('Y/m/d',mktime(0, 0, 0, date('m')-2, date('d')-12, date('Y')-3)); ?> |
結果は、
となります。
DateTimeクラス で現在から減算
現在から -5日、-1週間、-2カ月、-3年 減算
実行日:2019-01-01
1 2 | $objDateTime = new DateTime('today -5 day -1 week -2 month -3 year'); echo $objDateTime->format('Y/m/d'); |
※today は省略可能です。
結果は、
となります。
任意の日から日付を減算する
date() + strtotime() で任意の日付から減算
任意の日付 から -5日、-1週間、-2カ月、-3年 減算
任意の日付:2020-01-01
1 | <?php echo date('Y/m/d',strtotime("2020-01-01 -5 day -1 week -2 month -3 year")); ?> |
結果は、
となります。
date() + mktime() で任意の日付から減算
任意の日付 から -5日、-1週間、-2カ月、-3年 減算
任意の日付:2020-01-01
1 | <?php echo date('Y/m/d',mktime(0, 0, 0, 1-2, 1-12, 2020-3)); ?> |
結果は、
となります。
DateTimeクラス で任意の日付から減算
任意の日付 から -5日、-1週間、-2カ月、-3年 減算
任意の日付:2020-01-01
1 2 | $objDateTime = new DateTime('2020-01-01 -5 day -1 week -2 month -3 year'); echo $objDateTime->format('Y/m/d'); |
結果は、
となります。
タグ(=記事関連ワード)
日付
最終更新日:2019年06月24日