$birth_month = strtotime("-{$age} Years");
Эта строка рассчитывает дату относительно сегодняшнего дня. Поскольку сегодня 30-е число, дата будет 30-го числа соответствующего месяца. Учитывая, что вы прокручиваете месяцы, используя «+1 месяц» с этой даты, вы всегда будете смотреть на 30 число каждого месяца. Поскольку 30-го февраля не существует, PHP вычисляет это как 2-е марта (то есть через 2 дня после 28-го февраля). Если вы используете что-то вроде
$birth_month = strtotime("-{$age} Years");
$birth_month = mktime( 0, 0, 0, date( 'm', $birth_month ), 1, date( 'Y', $birth_month ) );
Ты должен быть в порядке.