A seguir um algoritmo que retorna o próximo dia útil do mês verificando também os feriados através de uma base de dados.
O script está escrito em C# mas ao final do post há um link para uma implementação em PHP caso prefira.
Vamos ao script:
public static DateTime diaUtil(DateTime dt) { while (true) { if (dt.DayOfWeek == DayOfWeek.Saturday) { dt = dt.AddDays(2); return diaUtil(dt); } else if (dt.DayOfWeek == DayOfWeek.Sunday) { dt = dt.AddDays(1); return diaUtil(dt); } else if (Feriado(dt) == true) { dt = dt.AddDays(1); return diaUtil(dt); } else return dt; } } public static bool Feriado(DateTime dt) { String strConn; strConn = "Data Source=localhost;Initial Catalog=Banco;"; strConn += "User ID=Usuario;Password=Senha;Max Pool Size=150; Connection Lifetime=0"; string sqlFeriado = ""; sqlFeriado += "SELECT dtferiado FROM feriado "; sqlFeriado += "WHERE dtferiado = '"; sqlFeriado += dt.ToString("dd/MM/yyyy") + "'"; SqlConnection objConnFeriado; SqlCommand cmdFeriado = new SqlCommand(); objConnFeriado = new SqlConnection(strConn); objConnFeriado.Open(); cmdFeriado.Connection = objConnFeriado; cmdFeriado.CommandText = sqlFeriado; SqlDataReader objDRFeriado = cmdFeriado.ExecuteReader(); if (objDRFeriado.Read()) return true; else return false; objDRFeriado.Close(); objConnFeriado.Close(); }
A função ‘Feriado’ é necessária para saber se o dia passado por parâmetro é um feriado. Essa função utiliza uma conexão com banco de dados SQL Server facilmente adaptada para outros bancos. A tabela feriado em questão possui apenas um campo do tipo DateTime com a data do feriado.
A função recursiva ‘diaUtil’ verifica primeiro se o dia é sábado ou domingo, avançando a data para segunda feira caso afirmativo. Logo após é verificado se é feriado com a função citada acima. O laço de repetição é feito enquanto não se encontrar uma data válida como sendo um dia útil. Para utilizar a função basta chama-la passando uma data como referência. Será retornado o primeiro dia útil encontrado. Por exemplo: para saber o primeiro dia útil do próximo mês você poderá fazer.
DateTime dt = DateTime.Now.AddMonths(1); dt = diaUtil(Convert.ToDateTime("01/" + dt.ToString("MM") + "/" + dt.ToString("yyyy")));
Para uma implementação em PHP veja este post do Felipe Marques.
