월말 계산
다음 달 마지막 날이 발송 예정인 알림에 대한 계산에 문제가 있습니다.
내 코드는 다음과 같습니다.
RecurrenceFrequency recurrenceFrequency = notification.getRecurrenceFrequency();
Calendar nextNotifTime = Calendar.getInstance();
이것이 내가 믿는 문제를 일으키는 선입니다.
nextNotifTime.add(recurrenceFrequency.getRecurrencePeriod(),
recurrenceFrequency.getRecurrenceOffset());
캘린더를 사용하여 다음 달의 마지막 날을 올바르게 설정하려면 어떻게해야합니까?
Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);
현재 달의 실제 최대 값을 반환합니다. 예를 들어 지금은 윤년의 2 월이므로 29를로 반환합니다 int.
java.time.temporal.TemporalAdjusters.lastDayOfMonth ()
은 Using java.time자바 8에 내장 된 라이브러리를, 당신은 사용할 수있는 TemporalAdjuster인터페이스를. TemporalAdjusters유틸리티 클래스 에서 사용할 수있는 구현을 찾으십시오 lastDayOfMonth.
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
LocalDate now = LocalDate.now(); //2015-11-23
LocalDate lastDay = now.with(TemporalAdjusters.lastDayOfMonth()); //2015-11-30
당신은 시간 정보를 추가해야하는 경우, 당신은 가능한을 사용할 수 있습니다 LocalDate에 LocalDateTime같은 변환
lastDay.atStartOfDay(); //2015-11-30T00:00
그리고 마지막 날을 Date 객체로 얻으려면 :
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));
Date lastDayOfMonth = cal.getTime();
다음 달 1 일로 캘린더를 설정 한 다음 하루를 뺄 수 있습니다.
Calendar nextNotifTime = Calendar.getInstance();
nextNotifTime.add(Calendar.MONTH, 1);
nextNotifTime.set(Calendar.DATE, 1);
nextNotifTime.add(Calendar.DATE, -1);
이 코드를 실행하면 nextNotifTime이 현재 달의 마지막 날로 설정됩니다. 오늘이 그 달의 마지막 날인 경우이 코드의 효과는 Calendar 객체가 변경되지 않는 것입니다.
다음은 항상 적절한 결과를 제공합니다.
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, ANY_MONTH);
cal.set(Calendar.YEAR, ANY_YEAR);
cal.set(Calendar.DAY_OF_MONTH, 1);// This is necessary to get proper results
cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));
cal.getTime();
최신 java.time라이브러리를 사용하는 것이 가장 좋은 해결책입니다.
LocalDate date = LocalDate.now();
LocalDate endOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());
또는 다음을 수행 할 수 있습니다.
LocalDate endOfMonth = date.withDayOfMonth(date.lengthOfMonth());
getActualMaximum(int field)Calendar 객체 의 메서드를 보십시오 .
달력 개체를 마지막 날짜를 찾는 달에 설정 getActualMaximum(Calendar.DAY_OF_MONTH)하면 마지막 날이 표시됩니다.
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date date = sdf.parse("11/02/2016");
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
System.out.println("First Day Of Month : " + calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
System.out.println("Last Day of Month : " + calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
YearMonth를 사용할 수도 있습니다.
처럼:
YearMonth.of(2019,7).atEndOfMonth()
YearMonth.of(2019,7).atDay(1)
https://docs.oracle.com/javase/8/docs/api/java/time/YearMonth.html#atEndOfMonth--를 참조 하십시오.
를 사용하여 Kotlin 날짜 확장 구현 java.util.Calendar
fun Date.toEndOfMonth(): Date {
return Calendar.getInstance().apply {
time = this@toEndOfMonth
}.toEndOfMonth().time
}
fun Calendar.toEndOfMonth(): Calendar {
set(Calendar.DAY_OF_MONTH, getActualMaximum(Calendar.DAY_OF_MONTH))
return this
}
You can call toEndOfMonth function on each Date object like Date().toEndOfMonth()
참고URL : https://stackoverflow.com/questions/9397203/last-day-of-month-calculation
'IT' 카테고리의 다른 글
| String 객체를 Hash 객체로 어떻게 변환합니까? (0) | 2020.07.03 |
|---|---|
| 배쉬 : 주어진 상대 경로를 검색 (0) | 2020.07.03 |
| 여러 값과 같은 MySQL (0) | 2020.07.03 |
| mongo-서버 127.0.0.1:27017에 연결할 수 없습니다 (0) | 2020.07.03 |
| 더 작은 RatingBar를 만드는 방법? (0) | 2020.07.03 |