Pessoal,

Seguem dois métodos simples que utiliza a API Calendar do JAVA para detectar os finais de semana de um determinado mês. Os dias dos mês que são finais de semana são colocados em uma List e retornados pelo método. Já me quebrou muitos galhos esses métodos.

Lembrando que em Calendar, o mês 01 (janeiro) começa com o valor 0.

O código abaixo está dividido em dois métodos. Há o isFinaDeSemana() que a partir de um dia, mês e ano, te devolve se é ou não um final de semana. O outro método getFinaisDeSemanaMes() te devolve uma list com todos os dias que são finais de semana em um mês.

  private List getFinaisDeSemanaMes(int ano, int mes)
  {
    Calendar calendar = new GregorianCalendar(ano, mes - 1, 1);
    int diasMaximos = calendar.getMaximum(Calendar.DAY_OF_MONTH);
    int dia = 1;
    List finaisDeSemana = new ArrayList();
 
    for (dia = 1; dia <= diasMaximos; dia++)
    {
      try
      {
        if (isFinalDeSemana(ano, mes, dia))
        {
          finaisDeSemana.add(new Long(dia));
        }
      }
      catch (Exception ex)
      {
        ex.printStackTrace();
        continue;
      }
    }
 
    return finaisDeSemana;
  }
 
  private boolean isFinalDeSemana(int ano, int mes, int dia) throws Exception
  {
    if ((mes < 1) || (mes > 12))
    {
      throw new Exception("Mês inválido");
    }
 
    boolean finalDeSemana;
    mes = mes - 1;
    Calendar data = new GregorianCalendar();
 
    data.set(ano, mes, 1);
    int diaMaximo = data.getActualMaximum(Calendar.DAY_OF_MONTH);
 
    if (diaMaximo < dia)
    {
      throw new Exception("Dia inválido");
    }
 
    data.set(ano, mes, dia);
    int diaDaSemana = data.get(Calendar.DAY_OF_WEEK);
 
    if ((diaDaSemana == Calendar.SATURDAY) || (diaDaSemana == Calendar.SUNDAY))
    {
      finalDeSemana = true;
    }
    else
    {
      finalDeSemana = false;
    }
 
    return finalDeSemana;
  }