Incrementar data - Como?

Pessoal, Como faço para acrescentar dias a uma data? por exemplo:

Date data = new Date(System.currentTimeMillis());

Suponhamos que quero somar 20 dias a esta data; Como posso fazer isso de forma que se altere também o mes caso a soma dos dias ultrapasse o mes corrente? (ex: 20/06/2006 + 20 dias = 10/07/2006)

Obrigado desde já!

Dê uma olhada nesse fórum http://forum.java.sun.com/thread.jspa?threadID=545180&messageID=2651836

abs

Cara, usa Calendar para isso, por exemplo,

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, 20);        
Date date = calendar.getTime();        
System.out.println(date);
Date hoje = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(hoje);
cal.add(Calendar.DAY_OF_MONTH, 1); // adiciona um dia na data
// cal.add(Calendar.DAY_OF_MONTH, 20); // adiciona 20 dias na data
Date amanha = cal.getTime();
import java.util.*;
import java.text.*;

class TesteAdicionarDatas {
    public static void main(String[] args) throws ParseException {
        DateFormat df = new SimpleDateFormat ("dd/MM/yyyy");
        df.setLenient (false); // se pegar uma data inválida, "parse" lança uma exceçao
        Date dt1 = new Date(); // Pegar a data e hora de hoje
        Date dt2 = df.parse ("29/02/2000"); 
        
        // Imprimir a data que é daqui a 20 dias
        Calendar cal = Calendar.getInstance();
        cal.setTime (dt1);
        cal.add (Calendar.DATE, 20); 
        dt1 = cal.getTime(); // agora dt1 recebe a data que é daqui a 20 dias.
        System.out.println (df.format (dt1)); 
        
        // Imprimir o dia posterior a 29/02/2000 - deve imprimir 01/03/2000
        cal.setTime (dt2);
        cal.add (Calendar.DATE, 1);
        System.out.println (df.format (cal.getTime()));
        
        // Imprimir a data que é 29/02/2000, menos 10 dias
        cal.setTime (dt2);
        cal.add (Calendar.DATE, -10);
        System.out.println (df.format (cal.getTime())); 
        
        // Somar quatro meses a 31/05/2006 - note que a data resultante vai ser
        // 30/09/2006, nao 01/10/2006. É que ele 
        dt1 = df.parse ("31/05/2006");
        cal.setTime (dt1);
        cal.add (Calendar.MONTH, 4);
        System.out.println (df.format (cal.getTime())); 
    }
}        

Muito obrigado, pessoal, agora não vai ter erro!
Um abraço a todos! Valew!

Hi thingol!

your code save my life!

thank you!

Um pouco mais simplificado…

GregorianCalendar vinte = new GregorianCalendar(2016, Calendar.JANUARY, 31);
vinte.add(GregorianCalendar.DATE, 20);

	Date data = vinte.getTime();
	DateFormat formato = DateFormat.getDateInstance();
	String resultado = formato.format(data);
	
	System.out.println("Daqui a 20 dias estaremos em " + resultado + ".\n");

Ou mais simplificado ainda você pode usar o Joda-Time :slight_smile:

DateTime dateTime = new DateTime();
System.out.println(dateTime.getDayOfMonth());// dia de hoje
System.out.println(dateTime.plusDays(20).getDayOfMonth());// dia de hoje mais 20 dias

Eu sofri demais para incrementar datas, usei varios metodos que pesquisei na net e nada, dai resolvi incrementar essa cacaca no braço, tai o que tive de fazer:

// …

final static int[] mMeses = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
private static final int greg[] = {1582, 10, 5, 14};
private static final int YEAR = 0;
private static final int MONTH = 1;

private ImageView prevDate;
private TextView displayDate;
private ImageView nextDate;
public String dateStr = "";

public static int days_of_february(int year) {
    int day;
    if ((year > greg[YEAR])
            || ((year == greg[YEAR])
            && (greg[MONTH] == 1
            || ((greg[MONTH] == 2)
            && (greg[LAST_DAY] >= 28))))) {
        day = ((year & 3) != 0) ? 28 : ((!((year % 100) != 0)) ? (((year % 9) == 2 || (year % 9) == 6) ? 29 : 28) : 29);
    } else
        day = ((year & 3) != 0) ? 28 :29;
    if (year == 4)
        day--;

    return (day);
}

// esse código foi para um app para android
// prevDate e nextDate são dois botoes, um de cada lado da data
// que é uma string num textedit
@Override
public void onClick(View v) {
    // incrementa apenas o dia

    if (v == prevDate) {
        aNewDay--;
    }

    if (v == nextDate) {
        aNewDay++;
    }
    
    // pega o ultimo dia de cada mes
    // se for fevereiro, verifica se o mes é bisexto, do contrario, pega o ultimo dia do mes
    // no array mMeses
    lastDayOfMonth = (aNewMonth == 2 ? days_of_february(aNewYear) : mMeses[aNewMonth - 1]);
    if (aNewDay > lastDayOfMonth) {
        aNewDay = 1;
        aNewMonth++;
        if (aNewMonth >= 12) {
            aNewMonth = 1;
            aNewYear++;
        }
    }
    if (aNewDay < 1) {
        aNewMonth--;
        if (aNewMonth <= 1) {
            aNewMonth = 12;
            aNewYear--;
        }
        aNewDay = (aNewMonth == 2 ? days_of_february(aNewYear) : mMeses[aNewMonth - 1]);
    }
    dateStr = String.valueOf(aNewDay) + "-" + String.valueOf(aNewMonth) + "-" + String.valueOf(aNewYear);
}

/ …

aqui funcionou redondinho
o referido codigo está funcionando nesse aplicativo
https://play.google.com/store/apps/details?id=com.armando.calendariolunarorganico
espero que ajude