Статьи


Как получить последний день месяца

Вернуться назад

30 сентября 2020

Тэги: Java Java 8 Kotlin

При работе с датами часто бывает нужно получить последний день текущего месяца или года. Поскольку последний день года всегда равен 31 декабря, то мы можем напрямую создать эту дату с помощью метода LocalDate.of(). А вот последний день месяца зависит от конкретного месяца. Дней в месяце может быть 30 или 31, а для февраля и вовсе 28 или 29.

Чтобы не разбираться в логике работы календаря, начиная с Java 8 (а, значит, и в Kotlin) нам доступен специальный класс TemporalAdjusters. Он имеет несколько полезных методов, но в данном случае нас интересует lastDayOfMonth(), возвращающий специальный объект с интерфейсом TemporalAdjuster. Этот интерфейс содержит метод adjustInto(), который позволяет «выравнивать» любую переданную ему дату (или дату со временем) по определённому правилу. В нашем случае дата будет выровнена по последнему дню месяца.

val lastDateOfCurrentMonth = TemporalAdjusters.lastDayOfMonth()
    .adjustInto(LocalDate.now()) // выравниваем текущую дату
val lastDateTimeOfCurrentMonth = TemporalAdjusters.lastDayOfMonth()
    .adjustInto(LocalDateTime.now()) // выравниваем текущую дату и время

Как видите, метод adjustInto() одинаково хорошо работает и с датой, и с датой и временем. В последнем случае выравнивается только дата. Время остаётся без изменений.

Помимо метода lastDayOfMonth(), класс TemporalAdjusters предлагает также и другие методы с говорящими названиями:

  • lastDayOfYear() - последний день года
  • firstDayOfMonth() - первый день месяца
  • firstDayOfNextMonth() - первый день следующего месяца
  • firstDayOfYear() - первый день года
  • firstDayOfNextYear() - первый день следующего года

Но остальные «выравниватели» менее интересны, т.к. первый день месяца или года всегда равен 1, а последний день года всегда равен 31.