<?php
$start = new DateTime('2017-07-11');
$end = new DateTime('2017-08-03');
$diff = $start->diff($end);
$differenceInDays = ($diff->format('%m') * 30) + $diff->format('%d');
// caso houver uma diferença menor de um mês,
// deve-se verificar se não passou pelo dia 31
if ($diff->format('%m') == 0)
{
//cria o trigésimo primeiro dia do mês inicial
$thiryFirstDayOfStartMonth = $start->format('Y-m-31');
// Cria o objeto DateTime do trigésimo primeiro dia do mês inicial
// Aqui está o "truque", caso o mês possuir apenas 30 dias,
// como o caso de novembro, a data 31/11/2017 será transformada em 01/12/2017
// é um comportamento padrão da biblioteca
$thirtyFirstDay = DateTime::createFromFormat('Y-m-d' , $thiryFirstDayOfStartMonth);
//O trigésimo primeiro dia precisa ser menor que a data final do cálculo.
if ($thirtyFirstDay < $end)
{
//Se data criada for realmente dia 31 do mês, deve-se
if ($thirtyFirstDay->format('Y-m-d') == $thiryFirstDayOfStartMonth)
{
$differenceInDays--;
}
}
}
var_dump($differenceInDays);
Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
int(22)