Calculo dos feriados móveis

Boa Tarde,

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.

int X=24;
			int Y=5;					
			int a = y % 19;
			int b= y % 4;
			int c = y % 7;
			int d = (19 * a + X) % 30;
			int e = (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.

Alguem poderia me ajudar?

Calendar calendar = Calendar.getInstance();
calendar.setTime(dataDaPascoa);
calendar.add(Calendar.SECOND, -47);

o “dataDaPascoa” é um java.util.Date, ok ?
Ele se vira bem com esse cálculo.

Então nel, eu estou trabalhando só com inteiros não com datas.

private void updateDayGrid (int m,JPanel p) {
		p.removeAll();
		int y = 0;
		int dia = 0;
		int pascoa = 0;
		try {
			y = Integer.parseInt(labelano.getText());
			m = mes;
		}
		catch(Exception e){}
		GregorianCalendar temp = new GregorianCalendar(y, m-1, 1);
		temp.setLenient(false);
		int offset = 0;
		switch(temp.get(GregorianCalendar.DAY_OF_WEEK)) {
		case GregorianCalendar.SUNDAY    : offset = 0; break;
		case GregorianCalendar.MONDAY    : offset = 1; break;
		case GregorianCalendar.TUESDAY   : offset = 2; break;
		case GregorianCalendar.WEDNESDAY : offset = 3; break;
		case GregorianCalendar.THURSDAY  : offset = 4; break;
		case GregorianCalendar.FRIDAY    : offset = 5; break;
		case GregorianCalendar.SATURDAY  : offset = 6; break;
		}

		String daynames[]={"D","S","T","Q","Q","S","S"};
		JLabel l[]=new JLabel[7];
		for(int i=0;i<7;i++){
			l[i]=new JLabel(daynames[i], JLabel.CENTER);
			p.add(l[i]);
			l[0].setForeground(Color.red);
			l[i].setForeground(Color.black);
			l[i].setFont(new Font("", Font.ITALIC, 13));
		}
		for (int i=1; i<=offset; i++) {
			p.add(new JLabel(""));
		}
		JButton day;
		for (int i=1; i<=getLastDay(); i++) {
			p.add(day = new JButton(String.valueOf(i)));
			day.setFont(new Font("SansSerif", Font.ITALIC, 12));
			day.setMargin(new java.awt.Insets(1,2,1,2)); 
			day.addActionListener(this);
			day.setForeground(Color.blue);
			//			p.setBackground(Color.WHITE);

			// mostra dia atual
			if ( 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 trabalhador
			if (m == 5 && i == 1)  {
				day.setForeground(Color.red);
				day.setToolTipText("Dia do Trabalho");
			}

			// mostra dia da independencia
			if (m == 9 && i == 7)  {
				day.setForeground(Color.red);
				day.setToolTipText("Independência");
			}

			// mostra dia de Nossa Senhora Aparecida
			if (m == 10 && i == 12)  {
				day.setForeground(Color.red);
				day.setToolTipText("Nossa Senhora Aparecida");
			}

			// mostra dia de Finados
			if (m == 11 && i == 2)  {
				day.setForeground(Color.red);
				day.setToolTipText("Finados");
			}

			// mostra dia da  Proclamação da República
			if (m == 11 && i == 15)  {
				day.setForeground(Color.red);
				day.setToolTipText("Proclamação da República");
			}

			// mostra dia do Natal
			if (m == 12 && i == 25)  {
				day.setForeground(Color.red);
				day.setToolTipText("Natal");
			}

			// mostra dia do Ano Novo
			if (m == 1 && i == 1)  {
				day.setForeground(Color.red);
				day.setToolTipText("Ano Novo");
			}

			// mostra feriado de Tiradentes
			if (m == 4 && i == 21)  {
				day.setForeground(Color.red);
				day.setToolTipText("Tiradentes");
			}

			// mostra feriado de Páscoa
			int X=24;
			int Y=5;					
			int a = y % 19;
			int b= y % 4;
			int c = y % 7;
			int d = (19 * a + X) % 30;
			int e = (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 (int i1=0; i1<JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT; i1++) {
				day.addActionListener(new ActionListener() {  
					public void actionPerformed(ActionEvent e) {  
						CadastroEmpresa l = new CadastroEmpresa();
						l.setVisible(true);
						l.setSize(new Dimension(800,500));
					}  
				});  
			}  
		}

		for (int i=(offset+getLastDay()+1); i<=42; i++) {
			p.add(new JLabel(""));
		}
		repaint();
	}

alguma sugestão?

[quote=Allexb10]Então nel, eu estou trabalhando só com inteiros não com datas.
…[/quote]

Por que? por que não deixa o Calendar fazer todo o “processamento pesado” ?

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?

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

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?

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

[quote=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?
[/quote]

É 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:

[code]StringBuffer sb = new StringBuffer();
sb.append(dia);
sb.append("/");
sb.append(mes);
sb.append("/");
sb.append(ano);

java.util.Date dataDaPascoa = new SimpleDateFormat(“dd/MM/yyyy”).parse(sb.toString());
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 [/code]

Isso facilitaria ?

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?