[java] 특정 연도의 특정 월의 일수는?

특정 월의 특정 월이 몇 일인지 아는 방법은 무엇입니까?

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 %에서 연도를 얻을 필요가 없습니다. 그리고 여전히 깨끗하고 읽기 쉬운 코드입니다.