매월 첫날과 마지막 날을 가져와야하는 LocalDate가 있습니다. 어떻게하나요?
예. 13/2/2014
내가 얻을 필요가 1/2/2014
와 28/2/2014
에 LOCALDATE의 형식을 지원합니다.
Threeten LocalDate 클래스 사용.
매월 첫날과 마지막 날을 가져와야하는 LocalDate가 있습니다. 어떻게하나요?
예. 13/2/2014
내가 얻을 필요가 1/2/2014
와 28/2/2014
에 LOCALDATE의 형식을 지원합니다.
Threeten LocalDate 클래스 사용.
답변:
API는 비즈니스 요구 사항과 밀접하게 일치하는 솔루션을 지원하도록 설계되었습니다.
import static java.time.temporal.TemporalAdjusters.*;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.with(firstDayOfMonth());
LocalDate end = initial.with(lastDayOfMonth());
그러나 Jon의 솔루션도 좋습니다.
YearMonth
완성도를 높이고 내 생각에 더 우아한 것을 보려면이 YearMonth
클래스 사용을 참조하십시오 .
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
방법에 비해 장점은 무엇 입니까?
LocalDate
시작할 인스턴스 가 필요하지 않습니다 .
Jon Skeets의 대답은 옳고 완전성을 위해 약간 다른 솔루션을 추가하는 것뿐입니다.
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 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);
원하는 출력을 찾을 수 있지만 getLastDayOfMonth에 대한 매개 변수 true / false 를 처리해야합니다. 메소드에
그 매개 변수는 윤년을 나타냅니다
getLastDayOfMonth
. 더 간단한 접근 방식은 내 대답을 참조하십시오.
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);
@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
여기서 사용하는 것은 정확히 잘못된 클래스입니다. 귀중한 영역 / 오프셋 정보를 버리고 있습니다.
Date
는 질문과 관련이 없으며 일반적으로 피해야합니다.
ZoneId.of("America/La_Paz")
. 현재 날짜의 경우 동일한 결과를 제공하지만 과거 날짜 또는 향후 날짜에 대해서는 그렇지 않을 수 있습니다.