Вы очень близки к желаемому результату:)
Вы нашли правильный способ перейти к концу месяца: setToFirstDayOfMonth
, тогда addDaysToDate
(-1 день) приведет вас к последнему дню предыдущего месяца.
Если вы посмотрите на реализацию метода addMonthsToDate
, вы увидите, что он не проверяет, сколько дней в данном месяце. Таким образом, вы можете получить недействительные даты, такие как Feb 30th
или Jun 31st
. Конечно, эти даты будут автоматически фиксированными и будут Mar 2nd
и Jul 1st
соответственно.
Таким образом, вы не можете использовать метод addMonthsToDate
в этом случае. Но вы уже знаете, как получить последний день предыдущего месяца - просто используйте его еще два раза, чтобы получить lastThreeMonthEndDate
:
Date currentMonthFirstDate = new Date();
CalendarUtil.setToFirstDayOfMonth(currentMonthFirstDate); //1st Sep
//Setting the Last month end date
final Date lastMonthEndDate = CalendarUtil.copyDate(currentMonthFirstDate);
CalendarUtil.addDaysToDate(lastMonthEndDate, -1); //31st Aug
final Date lastThreeMonthEndDate = CalendarUtil.copyDate(lastMonthEndDate);
CalendarUtil.setToFirstDayOfMonth(lastThreeMonthEndDate); //1st Aug
CalendarUtil.addDaysToDate(lastThreeMonthEndDate, -1); //31st Jul
CalendarUtil.setToFirstDayOfMonth(lastThreeMonthEndDate); //1st Jul
CalendarUtil.addDaysToDate(lastThreeMonthEndDate, -1); //30th Jun
Просто для рассмотрения: вы можете безопасно использовать метод addMonthsToDate
, при условии, что вы setToFirstDayOfMonth
сначала. Таким образом, вы не получите недействительные даты, потому что день 1st
действителен для любого месяца.