Calendar.getTime() traz o mês errado [ Resolvido ]

9 respostas
carolino

Tenho o seguindo código:

import java.util.Calendar;
import java.util.Date;


public class ManipulateLastDate {

	
	public static Date getLastDate(int month, int year){
		
		Calendar calendar = Calendar.getInstance();
	    
		calendar.set(Calendar.HOUR_OF_DAY, 23);
	    
		calendar.set(Calendar.MINUTE, 59);
	    
		calendar.set(Calendar.SECOND, 59);
		
		calendar.set(Calendar.MILLISECOND, 999);
		
		int lastDay = getLastDayOfMonth(calendar);
		
		calendar.set(year, month, lastDay);
		
		calendar.set(Calendar.DAY_OF_MONTH, lastDay);
		
		return calendar.getTime();
	}
	
	public static int getLastDayOfMonth(Calendar calendar) {

		return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

	}

	public static void main(String[] args) {
	
		final int year = 2012;
		
		for (int i = 1; i <= 12; i++) {
			
			System.out.println("month : " + i + " = " + getLastDate(i, year));
		}
	}
	
	
}

O problema que ao imprimir ele imprime:

month : 1 = Fri Mar 02 23:59:59 BRT 2012
month : 2 = Sat Mar 31 23:59:59 BRT 2012
month : 3 = Tue May 01 23:59:59 BRT 2012
month : 4 = Thu May 31 23:59:59 BRT 2012
month : 5 = Sun Jul 01 23:59:59 BRT 2012
month : 6 = Tue Jul 31 23:59:59 BRT 2012
month : 7 = Fri Aug 31 23:59:59 BRT 2012
month : 8 = Mon Oct 01 23:59:59 BRT 2012
month : 9 = Wed Oct 31 23:59:59 BRST 2012
month : 10 = Sat Dec 01 23:59:59 BRST 2012
month : 11 = Mon Dec 31 23:59:59 BRST 2012
month : 12 = Thu Jan 31 23:59:59 BRST 2013

Reparem que o mês está comletamente errado, alguém tem alguma idéia do porque vem errado?

9 Respostas

G

Quando você pega valor do mês no calendar, ele retorna 0 para o mês de janeiro, 1 para fevereiro até 11 para dezembro, não começa por 1 e sim por 0.

carolino

Mesmo com Zero o resultado continua similar

month : 0 = Tue Jan 31 23:59:59 BRST 2012
month : 1 = Fri Mar 02 23:59:59 BRT 2012
month : 2 = Sat Mar 31 23:59:59 BRT 2012
month : 3 = Tue May 01 23:59:59 BRT 2012
month : 4 = Thu May 31 23:59:59 BRT 2012
month : 5 = Sun Jul 01 23:59:59 BRT 2012
month : 6 = Tue Jul 31 23:59:59 BRT 2012
month : 7 = Fri Aug 31 23:59:59 BRT 2012
month : 8 = Mon Oct 01 23:59:59 BRT 2012
month : 9 = Wed Oct 31 23:59:59 BRST 2012
month : 10 = Sat Dec 01 23:59:59 BRST 2012
month : 11 = Mon Dec 31 23:59:59 BRST 2012
G

Qual o objetivo do seu código?

G

O problema é que você pega o dia do mês corrente no seu método getLastDayOfMonth(Calendar calendar), então ele retorna um integer 31, tenta pegar a data “31/02/2012”, o sistema retorna 02/03, por isso que fica estranho, se ao invés de retornar o dia do mês vc colocar outro valor, por exemplo 01, tua função vai retornar certo o dia 01 de fevereiro.

carlosmoreira

veja, acho que sei o seu problema,

esse:
int lastDay = getLastDayOfMonth(calendar);
fazendo isso
Calendar calendar = Calendar.getInstance();
vc pega a data 01/01/1900 00:00 dai vc faz isso
int lastDay = getLastDayOfMonth(calendar);
vc está recebendo sempre o último dia de janeiro.

vc precisa setar o ano e o mês antes de getLastDayOfMonth(calendar);

...
    calendar.set(Calendar.MILLISECOND, 999);

    calendar.set(Calendar.YEAR, year);
	
    calendar.set(Calendar.MONTH, month);
	
    int lastDay = getLastDayOfMonth(calendar);

    calendar.set(Calendar.DAY_OF_MONTH, lastDay);

  return calendar.getTime();

Daí funciona.

OBS. Os meses, no Calendar, começam em 0 (Janeiro).

carolino

Acho que o código ficou um pouco confuso em relação ao seu objetivo…

O objetivo desse código é retornar o ultimo dia/minuto/segundo daquele mês/ano passado como argumento

modificando um pouco o código com a dica do carlosmoreira consegui

resolver, o problema era o ultimo dia do mês que ele tava pegando errado…

obrigado carlosmoreira

public static Calendar getLastDate(int month, int year){
		
		 Calendar calendar = Calendar.getInstance();  
         
	        calendar.set(Calendar.HOUR_OF_DAY, 23);  
	          
	        calendar.set(Calendar.MINUTE, 59);  
	          
	        calendar.set(Calendar.SECOND, 59);  
	          
	        calendar.set(Calendar.MILLISECOND, 999);
	        
	        calendar.set(Calendar.MONTH, month);
	        
	        calendar.set(Calendar.YEAR, year);
	          
	        int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);  
	          
	        calendar.set(Calendar.DAY_OF_MONTH, lastDay);  
	          
	        return calendar;  
	}
	
	
	public static void main(String[] args) {

		final int year = 2012;
		
		for (int i = 1; i <= 12; i++) {
			
			System.out.println("month : " + i + " = " + getLastDate(i, year).getTime());
		}
	}
pmlm

O teu problema continua, mas estavas a executar no dia 31 e ele aparecia. Hoje como já é dia 1 já não o vês, só vais voltar a ter o mesmo problema no dia 29 ou 30 (para Fevereiro ) e no dia 31 (para os restantes).

O Calendar.getInstance() devolve a data actual. Portanto ontem devolvia 31/07/2013

Ao fazeres o set de MONTH para Fevereiro, vai dar 31 de Fevereiro, o que não existe e transformar em 2 de Março e já estás no mês errado. Antes de fazeres o set do MONTH, tens de fazer o set de DAY_OF_MONTH para 1 para garantires que não tens estes problemas.

carlosmoreira

É verdade pmlm.

confundi com getTimeInMillis() que retorna os milisegundos desde 1900… =]

carolino

Poxa pmlm não tinha percebido esse detalhe de setar o dia antes do mês para quando é o valor 30 31

Criado 31 de julho de 2013
Ultima resposta 1 de ago. de 2013
Respostas 9
Participantes 4