Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE

1. Overview

In this tutorial, we’ll learn how to find the number of days in a particular month of a given year when programming in Java. For example, for an input representing the month of March in the year 2024, our code would return 31.

2. Using YearMonth

Java 8 introduced a brand new Date/Time API. In particular, it added YearMonth, an immutable object representing the combination of a year and a month.

An instance of YearMonth can be easily created via the static factory method of(). Then, we can call its lengthOfMonth() method, which returns the length of the month, taking the year into account:

int getDaysInMonthWithYearOfMonth(int month, int year) {
    YearMonth yearMonth = YearMonth.of(year, month);
    return yearMonth.lengthOfMonth();
}

Let’s now check our method results with the following inputs:

  • March 2024 has 31 days
  • November 1999 has 30 days
  • February 2025 has 28 days
  • February 2004 has 29 days

Given that we called our class DaysInMonthUtils, we can write our unit tests:

@Test
void whenGetDaysInMonthWithYearOfMonth_thenCorrectResult() {
    assertEquals(31, new DaysInMonthUtils().getDaysInMonthWithYearOfMonth(3, 2024));
    assertEquals(30, new DaysInMonthUtils().getDaysInMonthWithYearOfMonth(11, 1999));
    assertEquals(28, new DaysInMonthUtils().getDaysInMonthWithYearOfMonth(2, 2025));
    assertEquals(29, new DaysInMonthUtils().getDaysInMonthWithYearOfMonth(2, 2004));
}

3. Using Calendar

With a version older than Java 8, we can fall back to the original Calendar API.

We can use Calendar‘s instance() method to get a Calendar object using the default time zone and locale. Then, we need to change the Calendar‘s date and month to be the given ones. Finally, we call getActualMaximum() with Calendar.DATE as a parameter to return our result:

int getDaysInMonthWithCalendar(int month, int year) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.DAY_OF_MONTH, 1);
    calendar.set(Calendar.YEAR, year);
    calendar.set(Calendar.MONTH, month - 1);
    return calendar.getActualMaximum(Calendar.DATE);
}

We took one off for the actual month number because Calendar uses zero-based indexing for months. Another interesting thing to note is that we set the day of the month to 1. At first glance, this seems out of purpose. However, we need this because Calendar adjusts the date based on the current day value. For instance, let’s assume we have a Calendar set on the 31st of July, and we change the month to June. Since there are only 30 days in June, the API rolls over to the next valid date, which is July 1st.

We can now use the same test inputs to verify our method’s behavior:

@Test
void whenGetDaysInMonthWithCalendar_thenCorrectResult() {
    assertEquals(31, new DaysInMonthUtils().getDaysInMonthWithCalendar(3, 2024));
    assertEquals(30, new DaysInMonthUtils().getDaysInMonthWithCalendar(11, 1999));
    assertEquals(28, new DaysInMonthUtils().getDaysInMonthWithCalendar(2, 2025));
    assertEquals(29, new DaysInMonthUtils().getDaysInMonthWithCalendar(2, 2004));
}

4. Conclusion

In this article, we used YearMonth to compute straightforwardly the number of days in a month. We also saw how to circumvent the design decisions of the Calendar API to ensure getting the correct result with it too.

As always, the code is available over on GitHub.

Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE
res – REST with Spring (eBook) (everywhere)
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.