Во-первых, ваш код не работает
Date startDate = new Date(Long.valueOf(""05/07/2018")getValue().toString());
Во-вторых, ваш метод private Date lastDayOfMonth(Date month)
выглядит хорошо, у меня есть тест, и я получил результат вт 31 июля 00: 00: 00
Я не понимаю вашу проблему: «Вторник, 31 июля, 00:00:00 по Гринвичу + 530 2018, но я получаю 30 вместо 31». Как вы можете получить 30-е с вт 31 июля 00:00:00 по Гринвичу + 530?