Я понимаю вашу проблему. На самом деле результат, который вы получаете, является правильным, потому что день заканчивается ночью 12 вечера, а вы проверяете в дневное время. До конца дня вы не можете получить полный месяц. Если вы добавляете один день и проверяетеполучит правильно 3 месяца
Ниже я внес некоторые изменения в ваш код ..
$new_date = date('Y-m-d', strtotime('2019-02-28' . ' +1 day'));
$date1 = strtotime("2019-01-01");
$date2 = strtotime($new_date);
$diff = abs($date2 - $date1);
$years = floor($diff / (365*60*60*24));
$months = floor(($diff - $years * 365*60*60*24)
/ (30*60*60*24));
printf("%d months",$months);
Вы также можете получить его, отправив запрос Mysql на сервер
SELECT TIMESTAMPDIFF(MONTH, '2019-01-01', (SELECT DATE_ADD('2019-02-28', INTERVAL 1 DAY))) as month
ВыМожно попробовать. Надеюсь, это поможет.