threeten, LocalDate를 사용하여 매월 1 일 및 마지막 날 가져 오기


127

매월 첫날과 마지막 날을 가져와야하는 LocalDate가 있습니다. 어떻게하나요?

예. 13/2/2014 내가 얻을 필요가 1/2/201428/2/2014LOCALDATE의 형식을 지원합니다.

Threeten LocalDate 클래스 사용.

답변:


180

withDayOfMonth, 및 lengthOfMonth()다음을 사용하십시오 .

LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.withDayOfMonth(initial.lengthOfMonth());

3
참고로 다른 답변을 참조
assylias을

147

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의 솔루션도 좋습니다.


5
이 문제를 해결하기 위해 특별히 만들어진 API 리소스를 사용합니다.
jpangamarca

87

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();

8
모두 최고의 솔루션입니다.
Agustí Sánchez

추가 정보 : YearMonth yearMonth = YearMonth.parse ( "202004", DateTimeFormatter.ofPattern ( "yyyyMM"));
egemen

LocalDate with방법에 비해 장점은 무엇 입니까?
AndrewBloom

@AndrewBloom은 매달 마지막 날을 가져 오기 위해 정적 함수를 사용할 필요가 없으며 적어도 두 번째 예에서는 LocalDate시작할 인스턴스 가 필요하지 않습니다 .
herman

18

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());

2
친애하는 반대 투표자 님, 솔직히, 저의 대답은 JodaStephen의 대답보다 하루 전이고, 주로 흥미로운 새로운 부분, 즉 월말의 임시 조정자에 대해 지적했기 때문에 저는 반대표를 이해하지 못합니다. 다른 사람의 대답을 "복사"하지 않았습니다.
Meno Hochschild

좋은 대답입니다! 이 솔루션은 문서 에서 권장되기 때문에 더 좋습니다 . "... 월의 첫 번째 또는 마지막 날 찾기"
peterchaula

4

사람이 찾고 오면 이전 달의 첫째 날이전 달의 마지막 날 :

public static LocalDate firstDayOfPreviousMonth(LocalDate date) {
        return date.minusMonths(1).withDayOfMonth(1);
    }


public static LocalDate lastDayOfPreviousMonth(LocalDate date) {
        return date.withDayOfMonth(1).minusDays(1);
    }

좋은 코드이지만 Stack Overflow에서 답변은 질문의 세부 사항을 다루어야합니다.
Basil Bourque

감사합니다. 동의합니다. 때때로 우리는 스레드에서 관련 코드를 찾을 수 있습니다. 나는 그런 사용자를 위해 그것을 넣었다. 괜찮 길 바랍니다. 감사.
Anil Bhaskar

3
 LocalDate monthstart = LocalDate.of(year,month,1);
 LocalDate monthend = monthstart.plusDays(monthstart.lengthOfMonth()-1);

답변을 설명해주세요
smilyface

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

1
나에게는 약간 복잡해 보인다. 또한 올바른 결과를 제공하지 않습니다. 이번 달의 마지막 날은 2019-12-31이지만 스 니펫은 2019-12-30으로 인쇄되었습니다.
Ole VV

0

이 시도:

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. 더 간단한 접근 방식은 내 대답을 참조하십시오.
Jon Skeet 2014 년

0

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);

0

@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여기서 사용하는 것은 정확히 잘못된 클래스입니다. 귀중한 영역 / 오프셋 정보를 버리고 있습니다.
Basil Bourque

질문은 여기서 찾는 날짜-시간 값이 아닌 날짜 전용 값을 요청합니다. 그리고 끔찍한 레거시 클래스 Date는 질문과 관련이 없으며 일반적으로 피해야합니다.
Basil Bourque

1
라 파스 시간대의 경우 더 정확한 ZoneId.of("America/La_Paz"). 현재 날짜의 경우 동일한 결과를 제공하지만 과거 날짜 또는 향후 날짜에 대해서는 그렇지 않을 수 있습니다.
Ole VV
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.