Threaten, LocalDate를 사용하여 월의 처음 및 마지막 날짜 가져오기
나는 이달의 첫날과 마지막 날을 받아야 하는 LocalDate가 있어.그걸 어떻게 하는 거죠?
예를 들어13/2/2014
나는 받아야 한다1/2/2014
그리고28/2/2014
LocalDate 형식으로.
Threaten LocalDate 클래스 사용.
그냥 사용해withDayOfMonth
그리고lengthOfMonth()
:
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.withDayOfMonth(initial.getMonth().length(initial.isLeapYear()));
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
완전성, 그리고 내 의견으로는 좀 더 품위 있게 수업의 활용을 보라.
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();
존 스키츠의 대답은 옳고 나의 업보트를 받을만 하다. 단지 완성도를 위해 약간 다른 해결책을 추가했을 뿐이다.
import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.with(lastDayOfMonth());
LocalDate monthstart = LocalDate.of(year,month,1);
LocalDate monthend = monthstart.plusDays(monthstart.lengthOfMonth()-1);
전월 초하루 및 전월 말일을 찾는 사람이 있는 경우:
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 endDate = startDate.withDayOfMonth(1).plusMonths(1).minusDays(1);
또는
LocalDate startDate = LocalDate.now();
System.out.println("startDate: "+startDate);
LocalDate firstDayOfMonth_of_startDate = startDate.withDayOfMonth(1);
System.out.println("firstDayOfMonth_of_startDate: "+firstDayOfMonth_of_startDate);
LocalDate firstDayOfNextMonth_of_startDate = firstDayOfMonth_of_startDate.plusMonths(1);
System.out.println("firstDayOfNextMonth_of_startDate: "+firstDayOfNextMonth_of_startDate);
LocalDate lastDayOfTheMonth_of_startDate = firstDayOfNextMonth_of_startDate.minusDays(1);
System.out.println("lastDayOfTheMonth_of_startDate: "+lastDayOfTheMonth_of_startDate);
// or everything in one line
LocalDate endDate = startDate.withDayOfMonth(1).plusMonths(1).minusDays(1);
System.out.println("endDate: "+endDate);
그리고 인쇄물
startDate: 2021-11-05
firstDayOfMonth_of_startDate: 2021-11-01
firstDayOfNextMonth_of_startDate: 2021-12-01
lastDayOfTheMonth_of_startDate: 2021-11-30
endDate: 2021-11-30
사용자 지정 날짜를 표시하지 않고 현재 달의 시작 및 종료 날짜를 표시해야 하는 경우:
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
그러나 이 달의 마지막 날에 대한 또 다른 해결책은 다음과 같다.
나는 다양한 선택지를 가지고 놀면서 배우고자 하는 학습자들을 위해 이 답을 썼다.나는 그것을 생산용으로 추천하지 않는다.
import java.time.LocalDate;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
//Test
System.out.println(lastDateOfMonth(LocalDate.of(2014, 1, 13)));
System.out.println(lastDateOfMonth(LocalDate.of(2014, 2, 13)));
System.out.println(lastDateOfMonth(LocalDate.of(2016, 2, 13)));
System.out.println(lastDateOfMonth(LocalDate.of(2014, 4, 13)));
}
static LocalDate lastDateOfMonth(LocalDate date) {
DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.parseDefaulting(ChronoField.DAY_OF_MONTH, 31)
.appendPattern("uuuu-MM")
.toFormatter(Locale.ENGLISH);
return LocalDate.parse(YearMonth.from(date).toString(), dtf);
}
}
출력:
2014-01-31
2014-02-28
2016-02-29
2014-04-30
어떻게 되는 겁니까?
함수는 형식의 문자열을 반환하고uuuu-MM
, 내가 사용했던 포맷은DateTimeFormatterBuilder
월 최대 일수인 31일까지 디폴트 해놨는데, 이게 모든 달 동안 작동되는 겁니다.
Trail: Date Time에서 최신 Date-Time API에* 대해 자세히 알아보십시오.
* Android 프로젝트에서 작업 중인데 Android API 수준이 여전히 Java-8과 호환되지 않는 경우 Disugaring을 통해 Java 8+ API를 확인하십시오.Android 8.0 Oreo는 이미 에 대한 지원을 제공한다는 점에 유의하십시오. 사용 방법을 알아보려면 이 답변과 이 답변을 확인하십시오.java.time
JDBC를 사용한 API.
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);
원하는 출력을 찾을 수 있지만 getLastDayOfMonth 메서드의 매개 변수 true/false를 처리해야 함
그 매개변수는 윤년을 나타낸다.
@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();
}
'IT이야기' 카테고리의 다른 글
vuex 저장소가 변경될 때 프로펠러 속성 업데이트 (0) | 2022.04.22 |
---|---|
Java Regex 캡처 그룹 (0) | 2022.04.22 |
Vuejs + 웹 팩: npm 실행 빌드 느림 (0) | 2022.04.21 |
v-for를 사용하여 vue.js를 사용하여 테이블을 렌더링하는 방법 (0) | 2022.04.21 |
Vue-resource에서 Express 정적 파일을 로드할 수 없음 (0) | 2022.04.21 |