특정 연도의 특정 월의 일수는?


158

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

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

7
질문이 정확히 무엇입니까?
ShaMan-H_Fel

참고로, 같은 몹시 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 나중에 자바 8에 내장 된 클래스. Oracle의 Tutorial 참조하십시오 .
Basil Bourque

답변:


368

자바 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

2
Java 8의 새로운 날짜 및 시간 API에서이를 수행하는 방법은 무엇입니까?
워렌 M. Nocos

2
@ WarrenM.Nocos 늦게 응답해서 죄송하지만 이번 달에는 활동하지 않았습니다. java 8 솔루션에 대한 편집 내용을 확인하십시오.
Hemant Metalia

Java 8 이전과 마찬가지로… java.time 기능의 대부분은 ThreeTen-Backport 프로젝트 에서 Java 6 & Java 7로 백 포트됩니다 . ThreeTenABP 프로젝트 에서 이전 Android에 더 적합합니다 . ThreeTenABP 사용 방법…을 참조하십시오 .
Basil Bourque

43

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.


27

당신은 Calendar.getActualMaximum방법 을 사용할 수 있습니다 :

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month);
int numDays = calendar.getActualMaximum(Calendar.DATE);


7
if (month == 4 || month == 6 || month == 9 || month == 11)

daysInMonth = 30;

else 

if (month == 2) 

daysInMonth = (leapYear) ? 29 : 28;

else 

daysInMonth = 31;

달력 c = Calendar.getInstance (); c.set (Calendar.DAY_OF_MONTH, c.getActualMaximum (Calendar.DAY_OF_MONTH)); // 실제 최대 코즈를 얻기 전에 연도를 설정할 수 있습니다. 즉 2011 년과 2012 년 2 월은 길이가 같지 않습니다 (윤년)
Rose

5

이것은 수학적 방법입니다.

연도, 월 (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;

3

나는 다음과 같은 해결책을 원할 것이다.

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


1
전체 논리를 검증 된 라이브러리 방법으로 유지하고 싶습니다. 매우 조기에 최적화하고 있으며 라이브러리 방법이 그렇게 비효율적이지 않다고 생각합니다. 현대의 java.time 사용에 대해서는 여전히 찬성했습니다.
Ole VV

@ OleV.V. 사실, 입증 된 라이브러리에 최적화를 두는 것이 더 나을 수 있습니다. 그러나이 경우 기존 라이브러리는 한 달과 1 년이 지나야합니다. 따라서이 방법으로 92 %의 값을 사용하지 않더라도 연도를 얻는 데 필요한 모든 조치를 취해야합니다. 그래서 그것은 나를 위해 최적화 할 수없는 부분입니다. 내 추론은 비활성화 될 수있는 로거에 값을 전달하기 위해 메소드 호출을하지 않아야하는 이유와 유사합니다. 로거가이를 최적화 할 수있는 방법은 없습니다.
Stefan Mondelaers

1

Java8에서는 날짜 필드에서 getRangeRange를 사용할 수 있습니다.

LocalDateTime dateTime = LocalDateTime.now();

ChronoField chronoField = ChronoField.MONTH_OF_YEAR;
long max = dateTime.range(chronoField).getMaximum();

이를 통해 필드를 매개 변수화 할 수 있습니다.


1

단순하므로 아무 것도 가져올 필요가 없습니다

public static int getMonthDays(int month, int year) {
    int daysInMonth ;
    if (month == 4 || month == 6 || month == 9 || month == 11) {
        daysInMonth = 30;
    }
    else {
        if (month == 2) {
            daysInMonth = (year % 4 == 0) ? 29 : 28;
        } else {
            daysInMonth = 31;
        }
    }
    return daysInMonth;
}

먼 미래에 역사적인 날짜 나 날짜가 필요하지 않은 경우에도 괜찮습니다. 100의 배수이지만 400의 배수가 아닌 2 월 동안은 잘못 될 것입니다. 그러나 나는 대부분의 응용 프로그램 에서이 작업을 수행하고 효율적이라고 동의합니다.
Stefan Mondelaers

1
// 1 means Sunday ,2 means Monday .... 7 means Saturday
//month starts with 0 (January)

MonthDisplayHelper monthDisplayHelper = new MonthDisplayHelper(2019,4);
int numbeOfDaysInMonth = monthDisplayHelper.getNumberOfDaysInMonth();

1
Android 용 ( android.util.MonthDisplayHelper)
barbsan

0
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/*
 * 44. Return the number of days in a month
 * , where month and year are given as input.
 */
public class ex44 {
    public static void dateReturn(int m,int y)
    {
        int m1=m;
        int y1=y;
        String str=" "+ m1+"-"+y1;
        System.out.println(str);
        SimpleDateFormat sd=new SimpleDateFormat("MM-yyyy");

        try {
            Date d=sd.parse(str);
            System.out.println(d);
            Calendar c=Calendar.getInstance();
            c.setTime(d);
            System.out.println(c.getActualMaximum(Calendar.DAY_OF_MONTH));
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    public static void main(String[] args) {
dateReturn(2,2012);


    }

}

1
이 답변은 기존 답변과 승인 된 답변보다 어떤 가치를 제공합니까? 또한 코드와 함께 설명이나 설명을 추가하십시오. StackOverflow는 스 니펫 라이브러리 이상입니다.
Basil Bourque

0
public class Main {

    private static LocalDate local=LocalDate.now();
    public static void main(String[] args) {

            int month=local.lengthOfMonth();
            System.out.println(month);

    }
}

6
설명도 추가하십시오.
BlackBeard

1
스택 오버플로에 오신 것을 환영합니다! 이 코드 스 니펫이 해결책이 될 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다. 앞으로 독자들에게 질문에 대한 답변을 제공하므로 해당 사람들이 코드 제안의 이유를 모를 수도 있습니다.
yivi

0

오래된 CalendarAPI는 사용 하지 않아야합니다.

Java8 이상 버전에서는이를 사용하여 수행 할 수 있습니다 YearMonth.

예제 코드 :

int year = 2011;
int month = 2;
YearMonth yearMonth = YearMonth.of(year, month);
int lengthOfMonth = yearMonth.lengthOfMonth();
System.out.println(lengthOfMonth);

Call requires API level 26 (current min is 21): java.time.YearMonth#lengthOfMonth
Vlad

0

연도 및 월의 값을 하드 코딩하지 않고 현재 날짜 및 시간에서 값을 가져 오려는 경우 간단하게 만들 수 있습니다.

Date d = new Date();
String myDate = new SimpleDateFormat("dd/MM/yyyy").format(d);
int iDayFromDate = Integer.parseInt(myDate.substring(0, 2));
int iMonthFromDate = Integer.parseInt(myDate.substring(3, 5));
int iYearfromDate = Integer.parseInt(myDate.substring(6, 10));

YearMonth CurrentYear = YearMonth.of(iYearfromDate, iMonthFromDate);
int lengthOfCurrentMonth = CurrentYear.lengthOfMonth();
System.out.println("Total number of days in current month is " + lengthOfCurrentMonth );

0

Calendar.getActualMaximum 메소드를 사용할 수 있습니다.

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month-1);
int numDays = calendar.getActualMaximum(Calendar.DATE);

그리고 month-1 is is of month는 원래 달 수를 취하는 반면 메소드에서 Calendar.class에서 아래와 같이 인수를 취합니다.

public int getActualMaximum(int field) {
   throw new RuntimeException("Stub!");
}

그리고 (int 필드)는 다음과 같습니다.

public static final int JANUARY = 0;
public static final int NOVEMBER = 10;
public static final int DECEMBER = 11;

0

다음 방법은 특정 달에 며칠을 제공합니다

public static int getNoOfDaysInAMonth(String date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    return (cal.getActualMaximum(Calendar.DATE));
}

0

최적의 성능 차이 :

public static int daysInMonth(int month, int year) {
    if (month != 2) {
        return 31 - (month - 1) % 7 % 2;
    }
    else {
        if ((year & 3) == 0 && ((year % 25) != 0 || (year & 15) == 0)) { // leap year
            return 29;
        } else {
            return 28;
        }
    }
}

도약 알고리즘 확인에 대한 자세한 내용은 여기를 참조하십시오.


-1
String  MonthOfName = "";
int number_Of_DaysInMonth = 0;

//year,month
numberOfMonth(2018,11); // calling this method to assign values to the variables MonthOfName and number_Of_DaysInMonth 

System.out.print("Number Of Days: "+number_Of_DaysInMonth+"   name of the month: "+  MonthOfName );

public void numberOfMonth(int year, int month) {
    switch (month) {
        case 1:
            MonthOfName = "January";
            number_Of_DaysInMonth = 31;
            break;
        case 2:
            MonthOfName = "February";
            if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) {
                number_Of_DaysInMonth = 29;
            } else {
                number_Of_DaysInMonth = 28;
            }
            break;
        case 3:
            MonthOfName = "March";
            number_Of_DaysInMonth = 31;
            break;
        case 4:
            MonthOfName = "April";
            number_Of_DaysInMonth = 30;
            break;
        case 5:
            MonthOfName = "May";
            number_Of_DaysInMonth = 31;
            break;
        case 6:
            MonthOfName = "June";
            number_Of_DaysInMonth = 30;
            break;
        case 7:
            MonthOfName = "July";
            number_Of_DaysInMonth = 31;
            break;
        case 8:
            MonthOfName = "August";
            number_Of_DaysInMonth = 31;
            break;
        case 9:
            MonthOfName = "September";
            number_Of_DaysInMonth = 30;
            break;
        case 10:
            MonthOfName = "October";
            number_Of_DaysInMonth = 31;
            break;
        case 11:
            MonthOfName = "November";
            number_Of_DaysInMonth = 30;
            break;
        case 12:
            MonthOfName = "December";
            number_Of_DaysInMonth = 31;
    }
}

-1

이것은 나를 위해 잘 작동했습니다.

이것은 샘플 출력입니다

import java.util.*;

public class DaysInMonth { 

    public static void main(String args []) { 

        Scanner input = new Scanner(System.in); 
        System.out.print("Enter a year:"); 

        int year = input.nextInt(); //Moved here to get input after the question is asked 

        System.out.print("Enter a month:"); 
        int month = input.nextInt(); //Moved here to get input after the question is asked 

        int days = 0; //changed so that it just initializes the variable to zero
        boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); 

        switch (month) { 
            case 1: 
                days = 31; 
                break; 
            case 2: 
                if (isLeapYear) 
                    days = 29; 
                else 
                    days = 28; 
                break; 
            case 3: 
                days = 31; 
                break; 
            case 4: 
                days = 30; 
                break; 
            case 5: 
                days = 31; 
                break; 
            case 6: 
                days = 30; 
                break; 
            case 7: 
                days = 31; 
                break; 
            case 8: 
                days = 31; 
                break; 
            case 9: 
                days = 30; 
                break; 
            case 10: 
                days = 31; 
                break; 
            case 11: 
                days = 30; 
                break; 
            case 12: 
                days = 31; 
                break; 
            default: 
                String response = "Have a Look at what you've done and try again";
                System.out.println(response); 
                System.exit(0); 
        } 

        String response = "There are " + days + " Days in Month " + month + " of Year " + year + ".\n"; 
        System.out.println(response); // new line to show the result to the screen. 
    } 
} //abhinavsthakur00@gmail.com

-1
String date = "11-02-2000";
String[] input = date.split("-");
int day = Integer.valueOf(input[0]);
int month = Integer.valueOf(input[1]);
int year = Integer.valueOf(input[2]);
Calendar cal=Calendar.getInstance();
cal.set(Calendar.YEAR,year);
cal.set(Calendar.MONTH,month-1);
cal.set(Calendar.DATE, day);
//since month number starts from 0 (i.e jan 0, feb 1), 
//we are subtracting original month by 1
int days = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(days);

어떤 대답이 무효화 될 때까지 이미 승인 된 질문에 대답 할 필요가 없습니다.
Deepak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.