Olá colegas,
Abaixo código para identificar feriados móveis além do horário de verão de qualquer ano. Tinha esse exemplo antigo desenvolvido em outra linguagem e resolvi postar para ajudar aos colegas.
import java.util.Calendar;
import java.util.GregorianCalendar;
public class InfoFeriadosMoveis {
public static void main(String[] args) {
int ano = args != null ? Integer.parseInt(args[0]) : 2012;
Calendar domPascoa = obterDomingoDePascoa(ano);
System.out.println("Pascoa " + ano + " = " + domPascoa.getTime() );
Calendar domCarnaval = obterDomingoDeCarnaval(ano);
System.out.println("Dom carnaval " + ano + " = " + domCarnaval.getTime() );
Calendar iniHrVerao = obterInicioHorarioVerao(ano);
System.out.println("Hr.Verao I " + ano + " = " + iniHrVerao.getTime() );
Calendar fimHrVerao = obterFimHorarioVerao(ano);
System.out.println("Hr.Verao F " + ano + " = " + fimHrVerao.getTime() );
}
public static Calendar obterInicioHorarioVerao(int year) {
Calendar dataIniHrVerao = new GregorianCalendar(year, 10, 1);
dataIniHrVerao.add(Calendar.DAY_OF_YEAR, (7 - (int) dataIniHrVerao.get(Calendar.DAY_OF_WEEK)) % 7);
dataIniHrVerao.add(Calendar.DAY_OF_YEAR,14);
return dataIniHrVerao;
}
public static Calendar obterFimHorarioVerao(int year) {
Calendar dataFimHrVerao = new GregorianCalendar(year + 1, 2, 1);
dataFimHrVerao.add(Calendar.DAY_OF_YEAR, (7 - (int) dataFimHrVerao.get(Calendar.DAY_OF_WEEK)) % 7);
dataFimHrVerao.add(Calendar.DAY_OF_WEEK,14);
if ( !dataFimHrVerao.equals(obterDomingoDeCarnaval(year)) )
return dataFimHrVerao;
else {
dataFimHrVerao.add(Calendar.DAY_OF_WEEK,7);
return dataFimHrVerao;
}
}
public static Calendar obterDomingoDePascoa(int year) {
int a = year % 19;
int b = year / 100;
int c = year % 100;
int d = b / 4;
int e = b % 4;
int f = (b + 8) / 25;
int g = (b - f + 1) / 3;
int h = (19 * a + b - d - g + 15) % 30;
int i = c / 4;
int k = c % 4;
int L = (32 + 2 * e + 2 * i - h - k) % 7;
int m = (a + 11 * h + 22 * L) / 451;
int month = (h + L - 7 * m + 114) / 31;
int day = ((h + L - 7 * m + 114) % 31) + 1;
Calendar dataDomingo = new GregorianCalendar(year, month-1, day);
return dataDomingo;
}
public static Calendar obterDomingoDeCarnaval(int year) {
Calendar domingoCarnaval = obterDomingoDePascoa(year);
domingoCarnaval.add(Calendar.DAY_OF_YEAR, -49);
return domingoCarnaval;
}
}
Qualquer dúvida posta ae