Get last day of current month in java
This article will discuss various ways to calculate last day of current month in java using below approaches.

1. Using LocalDate and YearMonth
Java 8 introduced a new class LocalDate for date handling.
It contains methods to add, subtract days, months, years from a date.
Besides, it has a now() method to get the current date.

Secondly, there is an YearMonth class, which is a combination of year and month of a date.
It has a lengthOfMonth() method, which returns the number of days in a month for that year.
To create an object of YearMonth, use its static of() method.

So, the combination of LocalDate and YearMonth classes can be used to get last day of current month.

import java.time.LocalDate;
import java.time.YearMonth;

public class LastDayOfMonthExample {
  public static void main(String[] args) {
    // get the current date
    LocalDate currentDate = LocalDate.now();
    // get year and month from the current date
    int year = currentDate.getYear();
    int month = currentDate.getMonthValue();

    // create a YearMonth object for the current year and month
    YearMonth yearMonth = YearMonth.of(year, month);

    // get last day of the current month as a day number
    int lastDayOfMonth = yearMonth.lengthOfMonth();

    System.out.println("Last day of the month: " + lastDayOfMonth);
  }
}

This prints

Last date of the month: 31

2. Using TemporalAdjusters

Java 8 introduced another class TemporalAdjusters, which contains static methods to get date components such as finding first or last day of month, year etc.
LocalDate has a with() method that access TemporalAdjusters argument and returns a new date adjusted according to the object that is supplied to it.
So, we supply a TemporalAdjusters object to get last day of month using its lastDayOfMonth() method to with() method of LocalDate.
On the new date that is returned by with(), we call getDayOfMonth(), which will return the last of current month as shown below.

import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;

public class LastDayOfMonth {
  public static void main(String[] args) {
    // get the current date
    LocalDate currentDate = LocalDate.now();
    // get last day of current month using TemporalAdjusters
    LocalDate lastDay = currentDate.
                        with(TemporalAdjusters.lastDayOfMonth()).
                        getDayOfMonth();
    System.out.println("Last day of the month: " + lastDay);
  }
}

3. Using Calendar class
java.util.Calendar class has get() methods to get components of a date, set() and add() methods to change date fields.

Using these methods, we move the current date to the first day of next month and then subtract 1 from it.
This will move the date to the last day of current month and retrieve the last day using its get() method as illustrated in below example.

import java.util.Calendar;

public class LastDayOfMonthExample {
  public static void main(String[] args) {
    // get the current date
    Calendar calendar = Calendar.getInstance();
    // get its year and month
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
        
    // get first day of the next month, then go back one day 
    // and get the last day of the current month
    calendar.set(year, month + 1, 1);
    calendar.add(Calendar.DATE, -1);
        
    // get the last day of the current month as a day number
    int lastDayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
    System.out.println("Last day of the month: " + lastDayOfMonth);
  }
}

4. Using DateUtils
This method also works on the same logic as previous method. That is, first we move the current date to first day of next month and then subtract 1 day from it.
The result will be the last date of previous month(or current month initially)

Apache Commons Lang library has a DateUtils class having method  truncate(), which sets the time of the date object to the beginning of the month.
This means the time components (hours, minutes, seconds, milliseconds) will be set to zero for the current date.
Then, using its addMonths() method, add one month to the truncated date. By doing this, we get the first day of the next month.
Thirdly, use its addDays() method, we subtract one day from the first day of the next month, which gives the last day of the current month.
Finally, convert the date object from last step to java.util.Calendar with toCalendar() method and get the last day from date object using its get() method.

import org.apache.commons.lang3.time.DateUtils;

public class LastDayOfMonthExample {
  public static void main(String[] args) {
    // get the current date
    Date currentDate = new Date();
    Date lastDay = DateUtils.addMonths(
                     DateUtils. 
                     truncate(currentDate, Calendar.MONTH), 1
                   );
    lastDay = DateUtils.addDays(lastDay, -1);
        
    // get the last day of the current month as a day number
    int lastDayOfMonth = DateUtils.toCalendar(lastDay).
                                  get(Calendar.DAY_OF_MONTH);
    System.out.println("Last day of the month: " + lastDayOfMonth);
  }
}

To include this library in your project, add below dependencies as per the build tool.

// GRADLE
implementation 'org.apache.commons:commons-lang3:3.12.0'

<!-- MAVEN -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

5. Using joda time library
Joda time library has a class DateTime, having now() method, which is used to get current date.
It also has dayOfMonth() and withMaximumValue() methods, which return the max day of a month, when used together.
Maximum day of a month is obviously the last day of month.

import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;

public class LastDayOfMonthExample {
  public static void main(String[] args) {
    // get the current date
    DateTime currentDate = DateTime.now();
        
    // get the last day of the month
    DateTime lastDayOfMonth = currentDate.
                              dayOfMonth().
                              withMaximumValue();
    System.out.println("Last day of the month: " + lastDayOfMonth);
  }
}

To include this library in your project, add below dependencies as per the build tool.

// GRADLE
implementation 'joda-time:joda-time:2.12.5'

<!-- MAVEN -->
<dependency>
  <groupId>joda-time</groupId>
  <artifactId>joda-time</artifactId>
  <version>2.12.5</version>
</dependency>

Hope the article was useful.