특정 월의 특정 월이 몇 일인지 아는 방법은 무엇입니까?
String date = "2010-01-19";
String[] ymd = date.split("-");
int year = Integer.parseInt(ymd[0]);
int month = Integer.parseInt(ymd[1]);
int day = Integer.parseInt(ymd[2]);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR,year);
calendar.set(Calendar.MONTH,month);
int daysQty = calendar.getDaysNumber(); // Something like this
답변
자바 8 이상
@ 워렌 엠 노 코스. Java 8의 새로운 Date and Time API 를 사용하려는 경우 java.time.YearMonth
클래스 를 사용할 수 있습니다 . Oracle Tutorial을 참조하십시오 .
// Get the number of days in that month
YearMonth yearMonthObject = YearMonth.of(1999, 2);
int daysInMonth = yearMonthObject.lengthOfMonth(); //28
테스트 : 윤년에 한 달을 시도하십시오 :
yearMonthObject = YearMonth.of(2000, 2);
daysInMonth = yearMonthObject.lengthOfMonth(); //29
자바 7 및 이전
달력을 만들고 연도 및 월을 설정하고 사용 getActualMaximum
int iYear = 1999;
int iMonth = Calendar.FEBRUARY; // 1 (months begin with 0)
int iDay = 1;
// Create a calendar object and set year and month
Calendar mycal = new GregorianCalendar(iYear, iMonth, iDay);
// Get the number of days in that month
int daysInMonth = mycal.getActualMaximum(Calendar.DAY_OF_MONTH); // 28
테스트 : 윤년에 한 달을 시도하십시오 :
mycal = new GregorianCalendar(2000, Calendar.FEBRUARY, 1);
daysInMonth= mycal.getActualMaximum(Calendar.DAY_OF_MONTH); // 29
답변
java.util.Calendar의 코드
를 사용해야하는 경우 다음 java.util.Calendar
을 원한다고 생각합니다.
int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
조다 시간 코드
그러나 개인적 으로 시작하는 대신 Joda Time을 사용하는 것이 좋습니다 java.util.{Calendar, Date}
.이 경우 다음을 사용할 수 있습니다.
int days = chronology.dayOfMonth().getMaximumValue(date);
문자열 값을 개별적으로 구문 분석하는 대신 구문 분석에 사용하는 날짜 / 시간 API를 얻는 것이 좋습니다. 에서 java.util.*
당신은 사용할 수 있습니다 SimpleDateFormat
; Joda Time에서는을 사용합니다 DateTimeFormatter
.
답변
당신은 Calendar.getActualMaximum
방법 을 사용할 수 있습니다 :
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month);
int numDays = calendar.getActualMaximum(Calendar.DATE);
답변
java.time.LocalDate
Java 1.8에서 다음 방법 lengthOfMonth
을 사용할 수 있습니다 java.time.LocalDate
.
LocalDate date = LocalDate.of(2010, 1, 19);
int days = date.lengthOfMonth();
답변
if (month == 4 || month == 6 || month == 9 || month == 11)
daysInMonth = 30;
else
if (month == 2)
daysInMonth = (leapYear) ? 29 : 28;
else
daysInMonth = 31;
답변
이것은 수학적 방법입니다.
연도, 월 (1 ~ 12) :
int daysInMonth = month == 2 ?
28 + (year % 4 == 0 ? 1:0) - (year % 100 == 0 ? (year % 400 == 0 ? 0 : 1) : 0) :
31 - (month-1) % 7 % 2;
답변
나는 다음과 같은 해결책을 원할 것이다.
int monthNr = getMonth();
final Month monthEnum = Month.of(monthNr);
int daysInMonth;
if (monthNr == 2) {
int year = getYear();
final boolean leapYear = IsoChronology.INSTANCE.isLeapYear(year);
daysInMonth = monthEnum.length(leapYear);
} else {
daysInMonth = monthEnum.maxLength();
}
월이 2 월이 아닌 경우 (건의 92 %), 해당 월에만 의존하며 연도를 포함하지 않는 것이 더 효율적입니다. 이런 식으로 윤년인지 여부를 알기 위해 로직을 호출 할 필요가 없으며 사례의 92 %에서 연도를 얻을 필요가 없습니다. 그리고 여전히 깨끗하고 읽기 쉬운 코드입니다.