У меня есть LocalDate, которому нужно получить первый и последний день месяца. Как я могу это сделать?
например. 13/2/2014
Мне нужно получить 1/2/2014
и 28/2/2014
в LocalDate форматы.
Использование трех десятков классов LocalDate.
У меня есть LocalDate, которому нужно получить первый и последний день месяца. Как я могу это сделать?
например. 13/2/2014
Мне нужно получить 1/2/2014
и 28/2/2014
в LocalDate форматы.
Использование трех десятков классов LocalDate.
Просто используйте withDayOfMonth
и lengthOfMonth()
:
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.withDayOfMonth(initial.lengthOfMonth());
API был разработан для поддержки решения, которое близко соответствует бизнес-требованиям.
import static java.time.temporal.TemporalAdjusters.*;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.with(firstDayOfMonth());
LocalDate end = initial.with(lastDayOfMonth());
Однако решения Джона тоже хороши.
YearMonth
Для полноты и элегантности, на мой взгляд, см. Использование _ 2_ класс.
YearMonth month = YearMonth.from(date);
LocalDate start = month.atDay(1);
LocalDate end = month.atEndOfMonth();
Для первого и последнего дня текущего месяца это будет:
LocalDate start = YearMonth.now().atDay(1);
LocalDate end = YearMonth.now().atEndOfMonth();
LocalDate
with
методом?
- person AndrewBloom; 12.03.2020
LocalDate
для начала.
- person herman; 15.03.2020
Ответ Джона Скитса правильный и заслужил мое одобрение, просто добавив это немного другое решение для полноты:
import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.with(lastDayOfMonth());
Если кто-то ищет первый день предыдущего месяца и последний день предыдущего месяца:
public static LocalDate firstDayOfPreviousMonth(LocalDate date) {
return date.minusMonths(1).withDayOfMonth(1);
}
public static LocalDate lastDayOfPreviousMonth(LocalDate date) {
return date.withDayOfMonth(1).minusDays(1);
}
Вы можете попробовать это, чтобы не указывать произвольную дату и если необходимо отображать даты начала и окончания текущего месяца:
LocalDate start = LocalDate.now().minusDays(LocalDate.now().getDayOfMonth()-1);
LocalDate end = LocalDate.now().minusDays(LocalDate.now().getDayOfMonth()).plusMonths(1);
System.out.println("Start of month: " + start);
System.out.println("End of month: " + end);
Результат:
> Start of month: 2019-12-01
> End of month: 2019-12-30
если вы хотите сделать это только с помощью класса LocalDate:
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = LocalDate.of(initial.getYear(), initial.getMonthValue(),1);
// Idea: the last day is the same as the first day of next month minus one day.
LocalDate end = LocalDate.of(initial.getYear(), initial.getMonthValue(), 1).plusMonths(1).minusDays(1);
Попробуй это:
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.withDayOfMonth(initial.getMonthOfYear().getLastDayOfMonth(false));
System.out.println(start);
System.out.println(end);
вы можете найти желаемый результат, но вам нужно позаботиться о параметре true / false для метода getLastDayOfMonth
этот параметр обозначает високосный год
getLastDayOfMonth
- см. Мой ответ о более простом подходе.
- person Jon Skeet; 06.03.2014
Просто здесь, чтобы показать мою реализацию решения @herman
ZoneId americaLaPazZone = ZoneId.of("UTC-04:00");
static Date firstDateOfMonth(Date date) {
LocalDate localDate = convertToLocalDateWithTimezone(date);
YearMonth baseMonth = YearMonth.from(localDate);
LocalDateTime initialDate = baseMonth.atDay(firstDayOfMonth).atStartOfDay();
return Date.from(initialDate.atZone(americaLaPazZone).toInstant());
}
static Date lastDateOfMonth(Date date) {
LocalDate localDate = convertToLocalDateWithTimezone(date);
YearMonth baseMonth = YearMonth.from(localDate);
LocalDateTime lastDate = baseMonth.atEndOfMonth().atTime(23, 59, 59);
return Date.from(lastDate.atZone(americaLaPazZone).toInstant());
}
static LocalDate convertToLocalDateWithTimezone(Date date) {
return LocalDateTime.from(date.toInstant().atZone(americaLaPazZone)).toLocalDate();
}
LocalDateTime
- это совершенно неподходящий класс для использования здесь. Вы теряете ценную информацию о зоне / смещении.
- person Basil Bourque; 21.09.2019
Date
не имеет ничего общего с Вопросом, и его обычно следует избегать.
- person Basil Bourque; 21.09.2019
ZoneId.of("America/La_Paz")
. Для сегодняшних дат это даст тот же результат, но, возможно, не для исторических дат или дат в будущем.
- person Ole V.V.; 22.09.2019