Estou fazendo um calendario (gregorian calendar), em que necessito destacar os feriados.
Quanto ao feriado da páscoa (que é o referencial para os demais), está feito.
intX=24;intY=5;inta=y%19;intb=y%4;intc=y%7;intd=(19*a+X)%30;inte=(2*b+4*c+6*d+Y)%7;if(d+e>9){dia=d+e-9;pascoa=4;}if(d+e<=9){dia=d+e+22;pascoa=3;}if(m==pascoa){if(i==dia){day.setForeground(Color.red);day.setToolTipText("Páscoa");}}if(m==pascoa){if(i==dia-2){day.setForeground(Color.red);day.setToolTipText("Sexta-Feira da Paixão");}}
O problema é como fazer com que, por exemplo, o carnaval de acordo com minha fórmula, será exatamente 47 dias antes da
páscoa.
Como faço para diminuir estes dias?
A pascoa deste ano foi 8/04, como diminuir 47 dias?
8 - 47 = numero negativo.
sem falar que o mes tem 31 dias… etc.
o “dataDaPascoa” é um java.util.Date, ok ?
Ele se vira bem com esse cálculo.
Allexb10
Então nel, eu estou trabalhando só com inteiros não com datas.
privatevoidupdateDayGrid(intm,JPanelp){p.removeAll();inty=0;intdia=0;intpascoa=0;try{y=Integer.parseInt(labelano.getText());m=mes;}catch(Exceptione){}GregorianCalendartemp=newGregorianCalendar(y,m-1,1);temp.setLenient(false);intoffset=0;switch(temp.get(GregorianCalendar.DAY_OF_WEEK)){caseGregorianCalendar.SUNDAY:offset=0;break;caseGregorianCalendar.MONDAY:offset=1;break;caseGregorianCalendar.TUESDAY:offset=2;break;caseGregorianCalendar.WEDNESDAY:offset=3;break;caseGregorianCalendar.THURSDAY:offset=4;break;caseGregorianCalendar.FRIDAY:offset=5;break;caseGregorianCalendar.SATURDAY:offset=6;break;}Stringdaynames[]={"D","S","T","Q","Q","S","S"};JLabell[]=newJLabel[7];for(inti=0;i<7;i++){l[i]=newJLabel(daynames[i],JLabel.CENTER);p.add(l[i]);l[0].setForeground(Color.red);l[i].setForeground(Color.black);l[i].setFont(newFont("",Font.ITALIC,13));}for(inti=1;i<=offset;i++){p.add(newJLabel(""));}JButtonday;for(inti=1;i<=getLastDay();i++){p.add(day=newJButton(String.valueOf(i)));day.setFont(newFont("SansSerif",Font.ITALIC,12));day.setMargin(newjava.awt.Insets(1,2,1,2));day.addActionListener(this);day.setForeground(Color.blue);// p.setBackground(Color.WHITE);// mostra dia atualif(i==calendario.get(Calendar.DATE)&&m-1==calendario.get(Calendar.MONTH)&&y==calendario.get(Calendar.YEAR)){day.setForeground(Color.green);day.setToolTipText("Hoje");}// mostra feriado do dia do trabalhadorif(m==5&&i==1){day.setForeground(Color.red);day.setToolTipText("Dia do Trabalho");}// mostra dia da independenciaif(m==9&&i==7){day.setForeground(Color.red);day.setToolTipText("Independência");}// mostra dia de Nossa Senhora Aparecidaif(m==10&&i==12){day.setForeground(Color.red);day.setToolTipText("Nossa Senhora Aparecida");}// mostra dia de Finadosif(m==11&&i==2){day.setForeground(Color.red);day.setToolTipText("Finados");}// mostra dia da Proclamação da Repúblicaif(m==11&&i==15){day.setForeground(Color.red);day.setToolTipText("Proclamação da República");}// mostra dia do Natalif(m==12&&i==25){day.setForeground(Color.red);day.setToolTipText("Natal");}// mostra dia do Ano Novoif(m==1&&i==1){day.setForeground(Color.red);day.setToolTipText("Ano Novo");}// mostra feriado de Tiradentesif(m==4&&i==21){day.setForeground(Color.red);day.setToolTipText("Tiradentes");}// mostra feriado de PáscoaintX=24;intY=5;inta=y%19;intb=y%4;intc=y%7;intd=(19*a+X)%30;inte=(2*b+4*c+6*d+Y)%7;if(d+e>9){dia=d+e-9;pascoa=4;}if(d+e<=9){dia=d+e+22;pascoa=3;}if(m==pascoa){if(i==dia){day.setForeground(Color.red);day.setToolTipText("Páscoa");}}if(m==pascoa){if(i==dia-2){day.setForeground(Color.red);day.setToolTipText("Sexta-Feira da Paixão");}}for(inti1=0;i1<JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT;i1++){day.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){CadastroEmpresal=newCadastroEmpresa();l.setVisible(true);l.setSize(newDimension(800,500));}});}}for(inti=(offset+getLastDay()+1);i<=42;i++){p.add(newJLabel(""));}repaint();}
alguma sugestão?
Rodrigo_Sasaki
Allexb10:
Então nel, eu estou trabalhando só com inteiros não com datas.
…
Por que? por que não deixa o Calendar fazer todo o “processamento pesado” ?
Allexb10
de acordo com minha aplicação, exige este tipo de trabalho.
foi a maneira que encontrei para fazer o que preciso.
é muito dificil fazer esta operação?
Rodrigo_Sasaki
eu imaginei que você pudesse fazer com Calendar, não vejo o problema, se quiser saber o dia da páscoa, é só fazer assim:
Calendar carnaval = Calendar.getInstance();
carnaval.setTime(dataDaPascoa);
carnaval.add(Calendar.DAY_OF_MONTH, -47);
int diaDoCarnaval = carnaval.get(Calendar.DAY_OF_MONTH);
int mesDoCarnaval = carnaval.get(Calendar.MONTH); // Lembrando que os meses vão de 0 a 11, e não de 1 a 12
Allexb10
Desculpe se não entendi, mas meu ano(y), mes(m) e
dia(i) são int, certo!?
O calculo para a páscoa está pronto e retornando também um int e é variável dependendo do ano.
carnaval.setTime(dataDaPascoa), necessita ser Date (o qual eu não estou recebendo em nenhum lugar) e também não posso passar fixo pois cada ano é diferente.
acredito que este método só da para usar quando a data é fixa, ou não?
Rodrigo_Sasaki
mas se você tem o ano, mes e dia, consegue setar tudo no seu Calendar.Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH, day); // day = sua variável de dia
calendar.set(Calendar.MONTH, month-1); // month = sua variável de mes
calendar.set(Calendar.YEAR, year); // year = sua variável de dia
nel
Allexb10:
Desculpe se não entendi, mas meu ano(y), mes(m) e
dia(i) são int, certo!?
O calculo para a páscoa está pronto e retornando também um int e é variável dependendo do ano.
carnaval.setTime(dataDaPascoa), necessita ser Date (o qual eu não estou recebendo em nenhum lugar) e também não posso passar fixo pois cada ano é diferente.
acredito que este método só da para usar quando a data é fixa, ou não?
É claro que não. Veja uma ideia, vamos supor que esse ano (não me recordo, só péssimo com feriados) a páscoa foi em 20/04/2012, ok ?
Então tu tem em inteiro, dia 20, mês 04 e ano 2012, certo. Vamos transformar isso em uma String:
StringBuffersb=newStringBuffer();sb.append(dia);sb.append("/");sb.append(mes);sb.append("/");sb.append(ano);java.util.DatedataDaPascoa=newSimpleDateFormat("dd/MM/yyyy").parse(sb.toString());Calendarcarnaval=Calendar.getInstance();carnaval.setTime(dataDaPascoa);carnaval.add(Calendar.DAY_OF_MONTH,-47);intdiaDoCarnaval=carnaval.get(Calendar.DAY_OF_MONTH);intmesDoCarnaval=carnaval.get(Calendar.MONTH);// Lembrando que os meses vão de 0 a 11, e não de 1 a 12
Isso facilitaria ?
Allexb10
Desculpe, mas não consegui unir as informacões com meu trabalho,
seria muito pedir para darem uma olhada na classe toda e mostrar-me como resolver?