A seguir um algoritmo que retorna o primeiro (ou o próximo) dia útil do mês.
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")));
DateTime dt = DateTime.Now.AddMonths(1);dt = diaUtil(Convert.ToDateTime(“01/” + dt.ToString(“MM”) + “/” + dt.ToString(“yyyy”)));
Primeiramente meus parabéns!!
Utilizei o seu mesmo algoritmo e fiz uma implementação em PHP.
Segue abaixo o link.
http://www.felipemarques.com.br/2011/06/04/script-php-mysql-para-retornar-o-proximo-dia-util-verificando-se-os-feriados/
Fiz algumas modificações na sua lógica, mas agradeço e muito pelo seu post, me ajudou muito!!
Abraço!!