Função para retornar o dia útil. (c#)

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")));

Artigos relacionados

Total de visitas: 3169.
Esta entrada foi publicada em CSharp, Ling. de Programação e marcada com a tag , , . Adicione o link permanente aos seus favoritos.

2 respostas a Função para retornar o dia útil. (c#)

  1. ed disse:

    DateTime dt = DateTime.Now.AddMonths(1);dt = diaUtil(Convert.ToDateTime(“01/” + dt.ToString(“MM”) + “/” + dt.ToString(“yyyy”)));

  2. 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!!

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>