Problema com compareTo do Calendar

6 respostas
leandrorw

Estou trabalhando com datas no java e estou com um problema na comparação de datas.
O código abaixo realiza corretamente a comparação de quase todas as datas, porém
se vc tentar dataInicial = 31/01/2009 e dataFinal = 02/02/2009 a saída do programa é
"Data final menor que a data inicial", isso esta errado a data está ok a data inicial é menor
que a final.

Se alguém souber como resolver esse problema eu agradeço.

import java.util.Calendar;
import java.util.Scanner;


public class TesteDatas {

	public static void main(String[] args) {
		
		Calendar dataInicial = Calendar.getInstance();
		Calendar dataFinal = Calendar.getInstance();
		
		dataInicial.clear();
		dataFinal.clear();
		
		Scanner teclado = new Scanner(System.in);
		
		System.out.println("Digite a data inicial: ");
		dataInicial = stringToDate(teclado.next());
		System.out.println("Digite a data final: ");
		dataFinal = stringToDate(teclado.next());
		
		if(dataInicial.compareTo(dataFinal) > 0) {
			System.out.println("Data final menor que a data inicial");
		} else {
			System.out.println("Data ok");
		}

	}
	
	public static Calendar stringToDate(String strData) {
		Calendar data = Calendar.getInstance();
		
		if (strData == null) {
			strData = new String("");
		}
		
		int dia = Integer.parseInt(strData.substring(0,2));
		int mes = Integer.parseInt(strData.substring(3,5));
		int ano = Integer.parseInt(strData.substring(6,10));
 
		data.set(ano, mes, dia);
 
		return data;
	}

}

6 Respostas

T

Tem um bug meio insidioso aqui:

int dia = Integer.parseInt(strData.substring(0,2));  
         int mes = Integer.parseInt(strData.substring(3,5));  
         int ano = Integer.parseInt(strData.substring(6,10));  
   
         data.set(ano, mes, dia);

Deveria ser (porque Calendar diz que o mês de janeiro é 0, não 1:

int dia = Integer.parseInt(strData.substring(0,2));  
         int mes = Integer.parseInt(strData.substring(3,5));  
         int ano = Integer.parseInt(strData.substring(6,10));  
   
         data.set(ano, mes - 1, dia);

Por que é assim? Vá reclamar com os criadores da linguagem C (que inventaram que janeiro é zero), e com o inventor do java.util.Calendar (que copiou essa mancada.).

sf.marcius
leandrorw:
public static Calendar stringToDate(String strData) {
		Calendar data = Calendar.getInstance();
		
		if (strData == null) {
			strData = new String("");
		}
		
		int dia = Integer.parseInt(strData.substring(0,2));
		int mes = Integer.parseInt(strData.substring(3,5));
		int ano = Integer.parseInt(strData.substring(6,10));
 
		data.set(ano, mes, dia);
 
		return data;
	}
pq vc tá usando substrings??? usa SimpleDateFormat!
public static Calendar stringToDate(String strData) throws ParseException
    {
        if (strData == null) {
            throw new RuntimeException("Data Inválida");
        }

        Calendar data = Calendar.getInstance();
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        data.setTime(dateFormat.parse(strData));
        return data;
    }

[]s

ramilani12

thingol:
Tem um bug meio insidioso aqui:
Por que é assim? Vá reclamar com os criadores da linguagem C (que inventaram que janeiro é zero), e com o inventor do java.util.Calendar (que copiou essa mancada.).

talvez eles entenderam que Jan a Dez é um array de meses … :lol:

sf.marcius

ramilani12:
thingol:
Tem um bug meio insidioso aqui:
Por que é assim? Vá reclamar com os criadores da linguagem C (que inventaram que janeiro é zero), e com o inventor do java.util.Calendar (que copiou essa mancada.).

talvez eles entenderam que Jan a Dez é um array de meses … :lol:

Na verdade é pq os meses nunca devem ser setados diretamente com números, mas sim utilizando as constantes para tal, definidos na classe Calendar (Calendar.JANUARY … Calendar.DECEMBER).

é desencorajado a se fazer:

// Calendar c = new GregorianCalendar(2009, 1, 29); // ERRO! Mes 1 nao é janeiro!
Calendar c = new GregorianCalendar(2009, 0, 29);    // correto, mas estranho ao olhar humano

o mais correto seria:

Calendar c = new GregorianCalendar(2009, Calendar.JANUARY, 29); // correto e legível!
leandrorw

Obrigado thingol e sf.marcius tinha me esquecido deste pequeno fator mais muito importante
e vou aceitar a dica do SimpleDateFormat para essas operações. Valeu mesmo.

ramilani12

sf.marcius:
ramilani12:
thingol:
Tem um bug meio insidioso aqui:
Por que é assim? Vá reclamar com os criadores da linguagem C (que inventaram que janeiro é zero), e com o inventor do java.util.Calendar (que copiou essa mancada.).

talvez eles entenderam que Jan a Dez é um array de meses … :lol:

Na verdade é pq os meses nunca devem ser setados diretamente com números, mas sim utilizando as constantes para tal, definidos na classe Calendar (Calendar.JANUARY … Calendar.DECEMBER).

é desencorajado a se fazer:

// Calendar c = new GregorianCalendar(2009, 1, 29); // ERRO! Mes 1 nao é janeiro!
Calendar c = new GregorianCalendar(2009, 0, 29);    // correto, mas estranho ao olhar humano

o mais correto seria:

Calendar c = new GregorianCalendar(2009, Calendar.JANUARY, 29); // correto e legível!

Sim mas prq diabos eles acharam que Janeiro é igual a 0 :stuck_out_tongue:

Criado 29 de janeiro de 2009
Ultima resposta 29 de jan. de 2009
Respostas 6
Participantes 4