How do I add one month to current date in Java?

JavaJava Time

Java Problem Overview


In Java how can I add one month to the current date?

Java Solutions


Solution 1 - Java

Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.MONTH, 1);

Solution 2 - Java

Java 8

LocalDate futureDate = LocalDate.now().plusMonths(1);

Solution 3 - Java

You can make use of apache's commons lang DateUtils helper utility class.

Date newDate = DateUtils.addMonths(new Date(), 1);

You can download commons lang jar at http://commons.apache.org/proper/commons-lang/

Solution 4 - Java

tl;dr

LocalDate::plusMonths

Example:

LocalDate.now( )
         .plusMonths( 1 );

Better to specify time zone.

LocalDate.now( ZoneId.of( "America/Montreal" )
         .plusMonths( 1 );

java.time

The java.time framework is built into Java 8 and later. These classes supplant the old troublesome date-time classes such as java.util.Date, .Calendar, & java.text.SimpleDateFormat. The Joda-Time team also advises migration to java.time.

To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations.

Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport and further adapted to Android in ThreeTenABP.

Date-only

If you want the date-only, use the LocalDate class.

ZoneId z = ZoneId.of( "America/Montreal" );
 LocalDate today = LocalDate.now( z );

>today.toString(): 2017-01-23

Add a month.

LocalDate oneMonthLater = today.plusMonths( 1 );

>oneMonthLater.toString(): 2017-02-23

Date-time

Perhaps you want a time-of-day along with the date.

First get the current moment in UTC with a resolution of nanoseconds.

Instant instant = Instant.now();

Adding a month means determining dates. And determining dates means applying a time zone. For any given moment, the date varies around the world with a new day dawning earlier to the east. So adjust that Instant into a time zone.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Now add your month. Let java.time handle Leap month, and the fact that months vary in length.

ZonedDateTime zdtMonthLater = zdt.plusMonths( 1 );

You might want to adjust the time-of-day to the first moment of the day when making this kind of calculation. That first moment is not always 00:00:00.0 so let java.time determine the time-of-day.

ZonedDateTime zdtMonthLaterStartOfDay = zdtMonthLater.toLocalDate().atStartOfDay( zoneId );

About java.time

The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.

The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

You may exchange java.time objects directly with your database. Use a JDBC driver compliant with JDBC 4.2 or later. No need for strings, no need for java.sql.* classes. Hibernate 5 & JPA 2.2 support java.time.

Where to obtain the java.time classes?


Joda-Time

Update: The Joda-Time project is now in maintenance mode. Its team advises migration to the java.time classes. I am leaving this section intact for posterity.

The Joda-Time library offers a method to add months in a smart way.

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime now = DateTime.now( timeZone );
DateTime nextMonth = now.plusMonths( 1 );

You might want to focus on the day by adjust the time-of-day to the first moment of the day.

DateTime nextMonth = now.plusMonths( 1 ).withTimeAtStartOfDay();

Solution 5 - Java

Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.MONTH, 1);
java.util.Date dt = cal.getTime();
        

Solution 6 - Java

(adapted from Duggu)

public static Date addOneMonth(Date date)
{
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.add(Calendar.MONTH, 1);
    return cal.getTime();
}

Solution 7 - Java

Use calander and try this code.

Calendar calendar = Calendar.getInstance();         
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DATE, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
Date nextMonthFirstDay = calendar.getTime();
calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
Date nextMonthLastDay = calendar.getTime();

Solution 8 - Java

you can use DateUtils class in org.apache.commons.lang3.time package

DateUtils.addMonths(new Date(),1);

Solution 9 - Java

public Date  addMonths(String dateAsString, int nbMonths) throws ParseException {
		String format = "MM/dd/yyyy" ;
		SimpleDateFormat sdf = new SimpleDateFormat(format) ;
		Date dateAsObj = sdf.parse(dateAsString) ;
		Calendar cal = Calendar.getInstance();
		cal.setTime(dateAsObj);
		cal.add(Calendar.MONTH, nbMonths);
		Date dateAsObjAfterAMonth = cal.getTime() ;
	System.out.println(sdf.format(dateAsObjAfterAMonth));
	return dateAsObjAfterAMonth ;
}`

Solution 10 - Java

If you need a one-liner (i.e. for Jasper Reports formula) and don't mind if the adjustment is not exactly one month (i.e "30 days" is enough):

new Date($F{invoicedate}.getTime() + 30L * 24L * 60L * 60L * 1000L)

Solution 11 - Java

This method returns the current date plus 1 month.

public Date  addOneMonth()  {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MONTH, 1);
        return cal.getTime();
}`

Solution 12 - Java

In order to find the day after one month, it is necessary to look at what day of the month it is today.

So if the day is first day of month run following code

Calendar calendar = Calendar.getInstance();

    Calendar calFebruary = Calendar.getInstance();
    calFebruary.set(Calendar.MONTH, Calendar.FEBRUARY);

    if (calendar.get(Calendar.DAY_OF_MONTH) == 1) {// if first day of month
	calendar.add(Calendar.MONTH, 1);
	calendar.set(Calendar.DATE, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
	Date nextMonthFirstDay = calendar.getTime();
	System.out.println(nextMonthFirstDay);

    }

if the day is last day of month, run following codes.

    else if ((calendar.getActualMaximum(Calendar.DAY_OF_MONTH) == calendar.get(Calendar.DAY_OF_MONTH))) {// if last day of month
	calendar.add(Calendar.MONTH, 1);
	calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
	Date nextMonthLastDay = calendar.getTime();
	System.out.println(nextMonthLastDay);
    }

if the day is in february run following code

    else if (calendar.get(Calendar.MONTH) == Calendar.JANUARY
	        && calendar.get(Calendar.DAY_OF_MONTH) > calFebruary.getActualMaximum(Calendar.DAY_OF_MONTH)) {// control of february

	calendar.add(Calendar.MONTH, 1);
	calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
	Date nextMonthLastDay = calendar.getTime();
	System.out.println(nextMonthLastDay);

    }

the following codes are used for other cases.

    else { // any day
	calendar.add(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
	Date theNextDate = calendar.getTime();
	System.out.println(theNextDate);
    }

Solution 13 - Java

You can use like this;

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String d = "2000-01-30";
Date date= new Date(sdf.parse(d).getTime());
date.setMonth(date.getMonth() + 1);

Solution 14 - Java

    Date dateAfterOneMonth = new DateTime(System.currentTimeMillis()).plusMonths(1).toDate();

Solution 15 - Java

Constants are in Portuguese because yes, but javadoc is understandable enough.

Just call

Calendar cal = Calendar.getInstance();
cal.setTime(yourDate);
DateSumUtil.sumOneMonth(cal);

and that's that. Related code:

package you.project.your_package_utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;

public class DateSumUtil {

	private static Integer[] meses31 = { 2, 4, 7, 9 };
    private static List<Integer> meses31List = Arrays.asList(meses31);
	private static SimpleDateFormat s = new SimpleDateFormat("dd/MM/yyyy");

	private static final int MES = Calendar.MONTH;
	private static final int ANO = Calendar.YEAR;
	private static final int DIA = Calendar.DAY_OF_MONTH;

	/**
	 * Receives a date and adds one month. <br />
	 * 
	 * @param c date to receive an added month, as {@code java.util.Calendar}
     * @param dia day of month of the original month
	 */
	public static void addOneMonth(Calendar c, int dia) throws ParseException {
	if (cal.get(MES) == 0) {			if (dia < 29)			cal.add(MES, 1);
		else {	if (cal.get(ANO) % 4 == 0) {	if (dia < 30)	cal.add(MES, 1);
												else			cal.setTime(s.parse("29/02/" + cal.get(ANO)));
				} else {						if (dia < 29)	cal.add(MES, 1);
												else			cal.setTime(s.parse("28/02/" + cal.get(ANO)));
	}	}	} else if (meses31List.contains(cal.get(MES))) {
		if (dia < 31) {											cal.add(Calendar.MONTH, 1);
																cal.set(DIA, dia);
		} else	cal.setTime(s.parse("30/" + (cal.get(MES) + 2) + "/" + cal.get(ANO)));
	} else {													cal.add(MES, 1);
																cal.set(DIA, dia);	}	
}

Solution 16 - Java

public class StringSplit {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		date(5, 3);
		date(5, 4);
	}

	public static String date(int month, int week) {
		LocalDate futureDate = LocalDate.now().plusMonths(month).plusWeeks(week);
		String Fudate = futureDate.toString();
		String[] arr = Fudate.split("-", 3);
		String a1 = arr[0];
		String a2 = arr[1];
		String a3 = arr[2];
		String date = a3 + "/" + a2 + "/" + a1;
		System.out.println(date);
		return date;
	}
}

Output:

10/03/2020
17/03/2020

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionkiranView Question on Stackoverflow
Solution 1 - JavaPiyush MattooView Answer on Stackoverflow
Solution 2 - JavasoftarnView Answer on Stackoverflow
Solution 3 - JavamnmView Answer on Stackoverflow
Solution 4 - JavaBasil BourqueView Answer on Stackoverflow
Solution 5 - Javakelevra88View Answer on Stackoverflow
Solution 6 - JavaMadBoomyView Answer on Stackoverflow
Solution 7 - JavaMadhuka DilhanView Answer on Stackoverflow
Solution 8 - JavaAlireza AlallahView Answer on Stackoverflow
Solution 9 - JavaDJAM Silvère GatienView Answer on Stackoverflow
Solution 10 - JavaBrimstedtView Answer on Stackoverflow
Solution 11 - JavaDJAM Silvère GatienView Answer on Stackoverflow
Solution 12 - JavatheMindView Answer on Stackoverflow
Solution 13 - Javaharun ugurView Answer on Stackoverflow
Solution 14 - JavaPradeep nainView Answer on Stackoverflow
Solution 15 - JavaG. PereiraView Answer on Stackoverflow
Solution 16 - Javavipanshu waliaView Answer on Stackoverflow