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.
importjava.util.Calendar;importjava.util.Scanner;publicclassTesteDatas{publicstaticvoidmain(String[]args){CalendardataInicial=Calendar.getInstance();CalendardataFinal=Calendar.getInstance();dataInicial.clear();dataFinal.clear();Scannerteclado=newScanner(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");}}publicstaticCalendarstringToDate(StringstrData){Calendardata=Calendar.getInstance();if(strData==null){strData=newString("");}intdia=Integer.parseInt(strData.substring(0,2));intmes=Integer.parseInt(strData.substring(3,5));intano=Integer.parseInt(strData.substring(6,10));data.set(ano,mes,dia);returndata;}}
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.).
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!Calendarc=newGregorianCalendar(2009,0,29);// correto, mas estranho ao olhar humano
o mais correto seria:
Calendarc=newGregorianCalendar(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!Calendarc=newGregorianCalendar(2009,0,29);// correto, mas estranho ao olhar humano
o mais correto seria:
Calendarc=newGregorianCalendar(2009,Calendar.JANUARY,29);// correto e legível!
Sim mas prq diabos eles acharam que Janeiro é igual a 0