简体   繁体   中英

Java: Customize adding 1 month to the current date

I've read around and basically I've figured out that the Calendar object is capable of adding 1 month to a date specified by using something like:

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

Although I don't like its behavior whenever the date is on either the 30 or 31. If ever I add 1 month to 01/31/2012, the output becomes 02/29/2012. When I add 1 more month, it becomes 03/29/2012.

Is there anyway I can force 02/29/2012 to become 03/01/2012 automatically?

Basically this is what I want to happen:

Default date: 01/31/2012

Add 1 month: 03/01/2012

Add 1 more month: 03/31/2012

What you are asking for is some implicit knowledge that if the starting date is the last day of the month, and you add 1 month, the result should be the last day of the following month. Ie the property "last-day-of-month" should be sticky.

This is not directly available in Java's Calendar , but one possible solution is to use Calendar.getActualMaximum(Calendar.DAY_OF_MONTH) to reset the day after incrementing the month.

Calendar cal = ...;
cal.add(Calendar.MONTH,1);
cal.set(Calendar.DAY_OF_MONTH,cal.getActualMaximum(Calendar.DAY_OF_MONTH));

You could even subclass GregorianCalendar and add a method

public Calendar endOfNextMonth() { ... }

to encapsulate the operation.

Well for add 30 days you can do something like this:

public static java.sql.Date sumarFechasDias(java.sql.Date fch, int days) {
    Calendar cal = new GregorianCalendar();
    cal.setTimeInMillis(fch.getTime());
    cal.add(Calendar.DATE, days);
    return new java.sql.Date(cal.getTimeInMillis());
}

if days=30, it will return your date with 30 days added.

It looks like you want the calendar to roll up to the beginning of the next month if the date of the next month is smaller than the date of the month before it. Here's how we'd do that:

Calendar cal = Calendar.getInstance();
int oldDay = cal.get(DAY_OF_MONTH);
cal.add(Calendar.MONTH, 1);

// If the old DAY_OF_MONTH was larger than our new one, then
// roll over to the beginning of the next month.
if(oldDay > cal.get(DAY_OF_MONTH){
  cal.add(Calendar.MONTH, 1);
  cal.set(Calendar.DAY, 1);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM