Data atual java

Feras fiz este algoritmo que pega o primeiro dia do mês e o ultimo dia dia do mês da data atual

como que eu faço para pegar o primeiro dia do mês anterior e ultimo dia do mês anterior baseado na data atual ?



    public static void main(String args[]) throws ParseException {
     
    	SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy");
    	Calendar cal = Calendar.getInstance();
        
        String dataDoDia = sd.format(new Date());
        Date data = null;
        data = sd.parse(dataDoDia);       
        cal.setTime(data);
        
            cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
            final Date primeiroDia = new Date(cal.getTimeInMillis());
            String primeiro = sd.format(primeiroDia);
            System.out.println("Primeiro dia Mes Atual: " + primeiro);

            cal.set(Calendar.DAY_OF_MONTH , cal.getActualMaximum(Calendar.DAY_OF_MONTH));
            final Date ultimoDia = new Date(cal.getTimeInMillis());
            String ultimo = sd.format(ultimoDia);
            System.out.println("Ultimo dia Mes Atual: " + ultimo);
    	}

Se entendi…

Você quer com a data atual… ou qualquer outra data… pegar a primeira e a última do mês? Isso?

ONHATE

não porque isso estou fazendo no codigo acima

Eu quero baseado na data atual com o new Date() pegar o 1° dia e o Ultimo dia do MÊS ANTERIOR

Dá uma olhada no método add() da classe Calendar: http://download.oracle.com/javase/1.4.2/docs/api/java/util/Calendar.html#add(int, int)

amhfilho

vc poderia dar um exemplo porque estou vendo o link que vc envio até mesmo antes mas não achei a minha solução ainda

[code] //Volta um mês…
GregorianCalendar cl = new GregorianCalendar();
cl.roll(GregorianCalendar.MONTH, -1);
if (cl.get(GregorianCalendar.MONTH) == GregorianCalendar.DECEMBER) {
cl.roll(GregorianCalendar.YEAR, -1);
}
//Pega o primeiro… sempre 1 não?? =)
/*
* Mas se quiser
* int date = cl.getMinimum(GregorianCalendar.DATE);
* cl.set(GregorianCalendar.DATE, date);
*/
cl.set(GregorianCalendar.DATE, 1);
System.out.println(cl.getTime());

    //Pega o último
    int date = cl.getMaximum(GregorianCalendar.DATE);
    cl.set(GregorianCalendar.DATE, date);
    System.out.println(cl.getTime());

[/code]

[code] //Volta um mês…
GregorianCalendar cl = new GregorianCalendar();
cl.roll(GregorianCalendar.MONTH, -1);
if (cl.get(GregorianCalendar.MONTH) == GregorianCalendar.DECEMBER) {
cl.roll(GregorianCalendar.YEAR, -1);
}
//Pega o primeiro
int date = cl.getMinimum(GregorianCalendar.DATE);
cl.set(GregorianCalendar.DATE, date);
System.out.println(cl.getTime());

    //Pega o último
    date = cl.getMaximum(GregorianCalendar.DATE);
    cl.set(GregorianCalendar.DATE, date);
    System.out.println(cl.getTime());[/code]

Para padronizar…

ONHATE

o primeiro dia sempre vai ser 1 mesmo vc esta certo, agora seu codigo esta dando certo mais gostaria de entender esse trecho aqui

			 //Volta um mês...  
			 GregorianCalendar cl = new GregorianCalendar();  
			 cl.roll(GregorianCalendar.MONTH, -1);  
			 if (cl.get(GregorianCalendar.MONTH) == GregorianCalendar.DECEMBER) {  
			     cl.roll(GregorianCalendar.YEAR, -1);  
			 } 

esse if porque esta GregorianCalendar.DECEMBER e se eu quiser setar algumas datas de outros meses para ver se traz o mes anterior ao que eu setar

exemplo aqui ele esta pegando a data atual

e se eu quiser setar uma data tipo 15/03/2011 ai o seu codigo teria que printar pra mim
Primeiro dia = 01/02/2011
Ultimo dia = 28/02/2011

Esse teste com dezembro é para ver se tem que diminuir um ano tbm…
olha só…
hoje = 03/01/2011
se voltar um mês = 03/12/2011 -> 2011 e tem que ser 2010
então volta um ano tbm…

No calendar… qualquer um… se trabalha com os “tempos” separados, mês, dia, ano, horas… e assim vai…
para cada um pode aumentar ou diminuir…

Se quiser ir para o dia 15/03/2011
No começo do seu código pode fazer isso… logo após instanciar ou na própria instancia mesmo tem os parametros… e depois segue o mesmo código…

entendi agora essa parte

			 //Volta um mês...  
			 GregorianCalendar cl = new GregorianCalendar();  
			 cl.roll(GregorianCalendar.MONTH, -1);  
			 if (cl.get(GregorianCalendar.MONTH) == GregorianCalendar.DECEMBER) {  
			     cl.roll(GregorianCalendar.YEAR, -1);  
			 } 

mais como posso testar outras datas com meses variados vc pode dar um exemplo ?

http://download.oracle.com/javase/1.4.2/docs/api/java/util/GregorianCalendar.html

Tem tudo ai …
A API do Java é muito boa!

estou testando com outras datas porém o ultimo dia do mês anterior esta vindo errado o codigo e o que esta abaixo

			 //Volta um mês...  
			 GregorianCalendar cl = new GregorianCalendar();
			 
			 DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");  
			 Date dataDigitada = (Date)formatter.parse("15/03/2011"); 
			 cl.setTime(dataDigitada);
			 
			 cl.roll(GregorianCalendar.MONTH, -1);  
			 if (cl.get(GregorianCalendar.MONTH) == GregorianCalendar.DECEMBER) {  
			     cl.roll(GregorianCalendar.YEAR, -1);  
			 }  
			 //Pega o primeiro  
			 int date = cl.getMinimum(GregorianCalendar.DATE);  
			 cl.set(GregorianCalendar.DATE, date);
			 Date primeiroDia = cl.getTime();
			 
			 System.out.println("Primeiro dia: " +  formatter.format(primeiroDia));  
			   
			 //Pega o último  
			 date = cl.getMaximum(GregorianCalendar.DATE);  
			 cl.set(GregorianCalendar.DATE, date); 
			 Date ultimoDia = cl.getTime();
			 System.out.println("Ultimo dia: " +  formatter.format(ultimoDia)); 

a saida deste codigo e

Primeiro dia: 01/02/2011
Ultimo dia: 03/03/2011

Troca:
getMinimum por getActualMinimum
getMaximum por getActualMaximum

Para ele validar o mês atual, senão o getMaximum sempre retornar 31 pois é o máximo de todos os meses… analisando o atual… fevereiro… 28 ou 29…

ONHATE

e isso mesmo valeu deu certo