# php date 日付の日数・月数差を計算

php で年月比較して月の差分をマイナスまで求める作業がありました
日付比較や操作なら Carbon が万能で便利ですが、今回みたいに変数1は変数2より小さい場合マイナスを出すファンクションがないようです。

// [PHP]日付の日数差を計算する
function day_diff($day11, $day2) {
    $timestamp1 = strtotime($day11);
    $timestamp2 = strtotime($day2);

    $seconddiff = abs($timestamp2 - $timestamp1);
    $daydiff = $seconddiff / (60 * 60 * 24);

    return $daydiff;

}

// 何日経過したか
$day = day_diff('2020-06-01', date('Y-m-d'));
echo "2019年6月1日から「".$day."」日が経過";
echo "<br>";
// 後何日か
$day = day_diff(date('Y-m-d'), '2019-08-12');

php5.3 以上ならDateTime::diff から DateIntervalプロジェクト返してくれることを利用

$date1 = new DateTime('2020-09-11');
$date2 = new DateTime('2021-04-20');

$diff = $date1->diff($date2);

echo $diff->format('%y') * 12 + $diff->format('%m');  # 7
$d1 = new DateTime("2020-09-01");
$d2 = new DateTime("2021-04-01");

echo $d1->diff($d2)->m;  # 7
echo $d1->diff($d2)->m + ($d1->diff($d2)->y*12);  # 7

流石にもう 2021 年なのでphp5.3 より低いバージョンはもう世の中に存在しない
DateTime::diff は php5.3 より低いバージョン使えない

$d1 = "2020-09-01";
$d2 = "2021-03-29";

echo (int)abs((strtotime($d1) - strtotime($d2))/(60*60*24*30)); //

少し長いけどわかりやすい回答

<?php

class Diff{

    public static function month($year_month1, $year_month2)
    {
        $year_month1 = strtotime($year_month1 . '01');
        $year_month2 = strtotime($year_month2 . '01');

        return self::monthFromDate($year_month1, $year_month2);
    }

    public static function monthFromDate($year_month1, $year_month2)
    {

        $count_month1 =(int)date("Y", $year_month1) * 12 + (int)date("n", $year_month1);
        $count_month2 =(int)date("Y", $year_month2) * 12 + (int)date("n", $year_month2);

        if ($count_month1 != $count_month2) {
            if ((int)date("j", $year_month2) > (int)date("j", $year_month1)) {
                $count_month2 = $count_month2 + 1;
            }
        }

        $diff_month = $count_month2 - $count_month1;

        return $diff_month;
    }

}

echo Diff::month('202001','202101');  # 12
echo Diff::month('202104','202101');  # -3
echo Diff::month('198701','202101');  # 408

# Carbon で月比較するなら diffInmonths

Carbon の比較するのも便利です

$old = new Carbon('2021-04-01');
$latest = new Carbon('2021-04-19');

echo $old == $latest;  # false
echo $old > $latest;   # false
echo $old < $latest;   # true

$old->diffInMonths($latest);    # 0

$date = Carbon::now()->addSeconds(3666);
echo $date->diffInSeconds();  # 3665
echo $date->diffInMinutes();  # 61
echo $date->diffInHours();    # 1
echo $date->diffInDays();     # 0

Carbon 公式サイト(英語) (opens new window)
A simple PHP API extension for DateTime.

2020-04-19
  • php

関連記事

Laravel toSql パラメータ付きで出力
正規表現一覧 よく使う検索・置換のパターン
Apache 初期設定メモ
codeigniter email ライブラリでメール送信 日本語対応
php 開発におけるコーディングルール・規約
php curl 使って クリックなしで POST 送信
PHP empty isset is_null の違い
php Exception エラーキャッチでメール送信
FlattenException deprecated
allowurlinclude の設定で ftp_connect()エラー
Lumen と Laravel 違い比較
Lumen8 で API 開発
Lumen8 で JWT ユーザー認証
PHP 8 リリース新機能と変更
解決!phpMyAdmin テーブル構造の内容が表示されない問題
twig 3 人気 PHP テンプレートエンジンがバージョンアップ
Smarty HTTP URL 取得できるサーバー関数
開発時によく使うゼロ埋めパディング作業まとめ
Laravel 5.7 の MVC 使う時のメモ
nuxtjs と codeigniter で jwt システム構築
HTML から PDF に変換 PHP ライブラリ mPDF の設定
PHP 7.4 にアップグレードして使えなくなる機能
php.ini 初期設定のいろいろ
爆速軽量フレームワーク codeigniter PHP 開発
Composer コマンドとオプション
Laravel Error についてのメモ