Feriados móveis e horário de verão

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