ТЛ; др
YearMonth.from(
LocalDate.now( ZoneId.of( "America/Montreal" ) )
).atEndOfMonth()
java.time
Вопрос и другие ответы используют старые устаревшие классы. Они были вытеснены классами java.time , встроенными в Java 8 и более поздние версии. См. Oracle Tutorial . Большая часть функций была перенесена в Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP .
LocalDate
Класс LocalDate
представляет значение только для даты без времени суток и без часового пояса. Хотя эти объекты не хранят часовой пояс, имейте в виду, что часовой пояс имеет решающее значение при определении текущей даты. В любой момент времени дата меняется по всему земному шару в зависимости от часового пояса.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId ); // 2016-06-25
YearMonth
Объедините с классом YearMonth
, чтобы определить последний день любого месяца.
YearMonth currentYearMonth = YearMonth.from( today ); // 2016-06
LocalDate lastDayOfCurrentYearMonth = currentYearMonth.atEndOfMonth(); // 2016-06-30
Кстати, и LocalDate
, и YearMonth
используют номера месяцев, как и следовало ожидать (1-12), а не шарик 0-11, который видели в старых классах даты и времени. Одно из многих неудачных дизайнерских решений, которые делают эти старые классы даты и времени такими хлопотными и запутанными.
TemporalAdjuster
Другой правильный подход - использование TemporalAdjuster
.
См. правильный ответ Пьера Генри .