199

How to know how many days has particular month of particular year?

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
1

22 Answers 22

455

Java 8 and later

@Warren M. Nocos. If you are trying to use Java 8's new Date and Time API, you can use java.time.YearMonth class. See Oracle Tutorial.

// Get the number of days in that month
YearMonth yearMonthObject = YearMonth.of(1999, 2);
int daysInMonth = yearMonthObject.lengthOfMonth(); //28  

Test: try a month in a leap year:

yearMonthObject = YearMonth.of(2000, 2);
daysInMonth = yearMonthObject.lengthOfMonth(); //29 

Java 7 and earlier

Create a calendar, set year and month and use 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

Test: try a month in a leap year:

mycal = new GregorianCalendar(2000, Calendar.FEBRUARY, 1);
daysInMonth= mycal.getActualMaximum(Calendar.DAY_OF_MONTH);      // 29
3
  • 2
    How to do this on Java 8's new Date and Time API? Commented Nov 9, 2015 at 11:36
  • 2
    @WarrenM.Nocos sorry for late response, but i wasnt active these months. please check the edit for the solution for java 8. Commented Jan 20, 2016 at 6:55
  • 1
    As for prior to Java 8… Much of the java.time functionality is back-ported to Java 6 & Java 7 in the ThreeTen-Backport project. Further adapted for earlier Android in the ThreeTenABP project. See How to use ThreeTenABP…. Commented Aug 3, 2018 at 19:20
51

Code for java.util.Calendar

If you have to use java.util.Calendar, I suspect you want:

int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

Code for Joda Time

Personally, however, I'd suggest using Joda Time instead of java.util.{Calendar, Date} to start with, in which case you could use:

int days = chronology.dayOfMonth().getMaximumValue(date);

Note that rather than parsing the string values individually, it would be better to get whichever date/time API you're using to parse it. In java.util.* you might use SimpleDateFormat; in Joda Time you'd use a DateTimeFormatter.

0
33

You can use Calendar.getActualMaximum method:

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

java.time.LocalDate

From Java 1.8, you can use the method lengthOfMonth on java.time.LocalDate:

LocalDate date = LocalDate.of(2010, 1, 19);
int days = date.lengthOfMonth();
14

This is the mathematical way:

For year (e.g. 2012), month (1 to 12):

int daysInMonth = month !== 2 ? 
  31 - (((month - 1) % 7) % 2) : 
  28 + (year % 4 == 0 ? 1 : 0) - (year % 100 == 0 ? 1 : 0) + (year % 400 == 0 ? 1 : 0)
7
if (month == 4 || month == 6 || month == 9 || month == 11) {
   daysInMonth = 30;
} else if (month == 2) {
    daysInMonth = (leapYear) ? 29 : 28;
else { 
    daysInMonth = 31;
}
1
  • Calendar c = Calendar.getInstance();c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH)); // you can set the year before you get the actual maximum coz they might not be the same. ie feb of 2011 and 2012 is not same length (leap year)
    – Rose
    Commented Jul 10, 2013 at 22:02
4

I would go for a solution like this:

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();
}

If the month isn't February (92% of the cases), it depends on the month only and it is more efficient not to involve the year. This way, you don't have to call logic to know whether it is a leap year and you don't need to get the year in 92% of the cases. And it is still clean and very readable code.

2
  • 2
    I’d prefer to leave the whole logic to a proven library method — I think you’re optimizing very prematurely, and the library methods aren’t that inefficient. Still upvoted for the use of the modern java.time.
    – Anonymous
    Commented Jun 26, 2019 at 10:52
  • @OleV.V. True, in many cases leaving the optimization to a proven library can be better. But, in this case, existing libraries will require to pass a month and year. So that means I need to do whatever it takes to get the year anyway even if the method won't use the value in 92% of the cases. So, that's a part it can't optimize for me. My reasoning is similar to the reason why you shouldn't do a method call to get a value to be passed to a logger which might be disabled. No way that the logger can optimize that. Commented Jun 26, 2019 at 11:27
3

Simple as that,no need to import anything

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;
}
1
  • This is OK, if you don't need historical dates or dates in far future. For February of years which are multiples of 100 but not multiples of 400, it will be wrong. But I agree, in most applications this will do and it is efficient. Commented Jun 26, 2019 at 11:35
2

In Java8 you can use get ValueRange from a field of a date.

LocalDateTime dateTime = LocalDateTime.now();

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

This allows you to parameterize on the field.

2

Lets make it as simple if you don't want to hardcode the value of year and month and you want to take the value from current date and time:

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 );
2
// 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
  • 1
    It's worth to note that it's for Android (android.util.MonthDisplayHelper)
    – barbsan
    Commented May 20, 2019 at 10:22
1

Following method will provide you the no of days in a particular month

public static int getNoOfDaysInAMonth(String date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    return (cal.getActualMaximum(Calendar.DATE));
}
1
  • whats the format of the string date should be passed ? Commented Mar 19, 2021 at 8:01
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
  • 1
    What value does this answer provide over the existing and accepted answers? Also, please add some explanation or narrative along with your code. StackOverflow is more than a snippet library. Commented Sep 10, 2014 at 16:29
0
public class Main {

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

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

    }
}
2
  • 6
    Add some explanations as well.
    – BlackBeard
    Commented Nov 14, 2017 at 6:59
  • 1
    Welcome to Stack Overflow! While this code snippet may be the solution, including an explanation really helps to improve the quality of your post. Remember that you are answering the question for readers in the future, and those people might not know the reasons for your code suggestion.
    – yivi
    Commented Nov 14, 2017 at 9:40
0

The use of outdated Calendar API should be avoided.

In Java8 or higher version, this can be done with YearMonth.

Example code:

int year = 2011;
int month = 2;
YearMonth yearMonth = YearMonth.of(year, month);
int lengthOfMonth = yearMonth.lengthOfMonth();
System.out.println(lengthOfMonth);
1
  • Call requires API level 26 (current min is 21): java.time.YearMonth#lengthOfMonth
    – Vlad
    Commented May 4, 2018 at 14:58
0

You can use Calendar.getActualMaximum method:

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

And month-1 is Because of month takes its original number of month while in method takes argument as below in Calendar.class

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

And the (int field) is like as below.

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

An optimal and performant variance:

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;
        }
    }
}

For more details on the leap algorithm check here

0

An alternative solution is to use a Calendar object. Get the current date and set the day so it is the first of the month. Then add one month and take away one day to get the last day of the current month. Finally fetch the day to get the number of days in the month.

Calendar today = getInstance(TimeZone.getTimeZone("UTC"));

Calendar currMonthLastDay = getInstance(TimeZone.getTimeZone("UTC"));
currMonthLastDay.clear();
currMonthLastDay.set(YEAR, today.get(YEAR));
currMonthLastDay.set(MONTH, today.get(MONTH));
currMonthLastDay.set(DAY_OF_MONTH, 1); 
currMonthLastDay.add(MONTH, 1);
currMonthLastDay.add(DAY_OF_MONTH, -1);

Integer daysInMonth = currMonthLastDay.get(DAY_OF_MONTH);
-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

This worked fine for me.

This is a Sample Output

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. 
    } 
} //[email protected]
-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);
1
  • 1
    No need to answer to a question that is already accepted, until that answer invalid any how.
    – Deepak
    Commented Sep 24, 2014 at 7:29
-1

Number of days in particular year - Java 8+ solution

Year.now().length()
1
  • 1
    Does not address the Question. The Question is about length of month, not year. And the .length() method has been covered multiple times already in other Answers. Commented Nov 27, 2020 at 5:39

Not the answer you're looking for? Browse other questions tagged or ask your own question.