(41) 9225-6319
contato@felipemarques.com.br

Script PHP + MySQL para retornar o próximo dia útil verificando se os feriados

Segue abaixo a implementação de um script que verificar o próximo dia útil e faz uma pesquisa na base de dados para verificar se o próximo dia útil é um feriado.

Primeiramente vamos criar nossa tabela que irá armazenar todos os feriados. Percebam que a tabela possui apenas dia, mes e titulo, o ano achei que poderia desconsiderar e deixar o script mais genérico, pois assim pode ser utilizado para outros anos também.

-- phpMyAdmin SQL Dump
-- version 3.3.9
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tempo de Geração: Jun 04, 2011 as 08:37 PM
-- Versão do Servidor: 5.5.8
-- Versão do PHP: 5.3.5

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Banco de Dados: `clubedocafe`
--

-- --------------------------------------------------------

--
-- Estrutura da tabela `feriados`
--

CREATE TABLE IF NOT EXISTS `feriados` (
  `feriado` int(11) NOT NULL AUTO_INCREMENT,
  `dia` int(11) NOT NULL,
  `mes` int(11) NOT NULL,
  `titulo` varchar(255) NOT NULL,
  PRIMARY KEY (`feriado`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

--
-- Extraindo dados da tabela `feriados`
--

INSERT INTO `feriados` (`feriado`, `dia`, `mes`, `titulo`) VALUES
(1, 25, 12, 'Feriado Nacional - Natal'),
(2, 6, 6, 'Dia de São Marcelino Champanat'),
(3, 23, 6, 'Feriado Nacional - Corpus Christi'),
(4, 7, 9, 'Feriado Nacional - Independência do Brasil');

Após criarmos nossa tabela, e após cadastrarmos os feriados, vamos iniciar nosso script que foi baseado no blog MarvinSiq, mais especificamente nese post, onde ele mostra uma implementação em C# (c-sharp).

Vamos criar primeiro uma função que vai receber como parâmetro uma data no formato timestamp.

<?php
// Exemplo de timestamp

$timestamp = time();
echo $timestamp;
echo '<br>';
echo date('d/m/Y',$timestamp);

?>

Neste script precisaremos verificar e descobrir o dia da semana. Para isso utilize a função abaixo:

/**
 * @author Felipe Marques
 * @email felipecaioba@gmail.com
 * @param $timestamp
 * @return (string) $diaSemana
 * */
function getDayOfWeek($timestamp){
	$date = getdate($timestamp);
	$diaSemana = $date['weekday'];

	if(preg_match('/(sunday|domingo)/mi',$diaSemana))
		$diaSemana = 'Domingo';
	else if(preg_match('/(monday|segunda)/mi',$diaSemana))
		$diaSemana = 'Segunda';
	else if(preg_match('/(tuesday|terça)/mi',$diaSemana))
		$diaSemana = 'Terça';
	else if(preg_match('/(wednesday|quarta)/mi',$diaSemana))
		$diaSemana = 'Quarta';
	else if(preg_match('/(thursday|quinta)/mi',$diaSemana))
		$diaSemana = 'Quinta';
	else if(preg_match('/(friday|sexta)/mi',$diaSemana))
		$diaSemana = 'Sexta';
	else if(preg_match('/(saturday|sábado)/mi',$diaSemana))
		$diaSemana = 'Sábado';
		
	return $diaSemana;
}

Agora iremos criar uma função que vai conectar no banco de dados e vai consultar a tabela de feriados e verificar se a data ao qual estamos verificar é um feriado ou não.

<?php
/*
* @author Felipe Marques
* @email felipecaioba@gmail.com
* @params $data (timestamp)
* @return (boolean)
*/
function Feriado($data){

	// neste exemplo partimos do princípio que voce ja possua alguma objeto de conexão
	// ou alguma função ou classe de manipulação de dados da base de dados.
	global $CONEXAO;
	
	// transformando a data timestamp e pegando o dia e o mes
	$dia = date('d',$data);
	$mes = date('m',$data);
	
	// fazemos um consulta no banco de dados e verificamos se o dia, data e o titulo fazem parte de um feriado nacional
	$CONEXAO->sql("SELECT * FROM feriados WHERE dia=$dia AND mes=$mes AND titulo like '%feriado nacional%'");
	
	// se houver algum feriado nesse dia e mes e for um feriado nacional entao retorna TRUE
	if($CONEXAO->nlinhas() > 0){
		return true;
	}else{
		return false;
	}
	
}
?>

Agora vamos criar uma função que vai verificar se o dia ao qual estamos verificando, é um sábado ou um domingo e se nao for final de seman vai verificar se é um feriado.
A função é recursiva.

<?php

function diaUtil($data){

	while(true){
	
		if(getDayOfWeek($data) == 'Sábado'){

			$data = $data + (86400 * 2);
			return diaUtil($data);
			
		}else if(getDayOfWeek($data) == 'Domingo'){
			
			$data = $data + (86400 * 1);
			return diaUtil($data);
			
		}else if(Feriado($data) == true){
			$data = $data + (86400 * 1);
			return diaUtil($data); 
		}
		else{
			return $data;
		}
			
	}
	
}

?>

Para finalizar precisamos informar ao script a partir de qual data ele irá iniciar a verificação.

$dataHoje = time();
$proximoDiaUtil = diaUtil($dataHoje);
$proximoDiaUtil = date('d/m/Y',$proximoDiaUtil );

echo $proximoDiaUtil;

É isso ai, espero que esta solução sirva para a comunidade PHP.

Abraços!!!

Sobre o autor
Felipe Marques é Consultor e Analista de Sistemas Web e Mobile. Mais de 10 anos de experiência.
Por :
Comentários : 2
  1. Pingback: Função para retornar o dia útil. (c#) |Blog do Marvin

  2. Gilson Reply

    Estou tentando utilizar o código mais esta dando erro, pode ajudar:

    <?php
    // Exemplo de timestamp

    $timestamp = time();
    echo $timestamp;
    echo '’;
    echo date(‘d/m/Y’,$timestamp);

    /**
    * @author Felipe Marques
    * @email felipecaioba@gmail.com
    * @param $timestamp
    * @return (string) $diaSemana
    * */
    function getDayOfWeek($timestamp){
    $date = getdate($timestamp);
    $diaSemana = $date[‘weekday’];

    if(preg_match(‘/(sunday|domingo)/mi’,$diaSemana))
    $diaSemana = ‘Domingo’;
    else if(preg_match(‘/(monday|segunda)/mi’,$diaSemana))
    $diaSemana = ‘Segunda’;
    else if(preg_match(‘/(tuesday|terça)/mi’,$diaSemana))
    $diaSemana = ‘Terça’;
    else if(preg_match(‘/(wednesday|quarta)/mi’,$diaSemana))
    $diaSemana = ‘Quarta’;
    else if(preg_match(‘/(thursday|quinta)/mi’,$diaSemana))
    $diaSemana = ‘Quinta’;
    else if(preg_match(‘/(friday|sexta)/mi’,$diaSemana))
    $diaSemana = ‘Sexta’;
    else if(preg_match(‘/(saturday|sábado)/mi’,$diaSemana))
    $diaSemana = ‘Sábado’;

    return $diaSemana;
    }
    function Feriado($data){

    // neste exemplo partimos do princípio que voce ja possua alguma objeto de conexão
    // ou alguma função ou classe de manipulação de dados da base de dados.

    $conexao = mysql_connect(“localhost”, “root”, “admin”) or print (mysql_error());
    mysql_select_db(“gesec”, $conexao) or print(mysql_error());
    print “Conexao e Selecao OK!”;

    global $CONEXAO;

    // transformando a data timestamp e pegando o dia e o mes
    $dia = date(‘d’,$data);
    $mes = date(‘m’,$data);

    // fazemos um consulta no banco de dados e verificamos se o dia, data e o titulo fazem parte de um feriado nacional
    $CONEXAO->sql(“SELECT * FROM feriados WHERE dia=$dia AND mes=$mes AND titulo like ‘%feriado nacional%'”);

    // se houver algum feriado nesse dia e mes e for um feriado nacional entao retorna TRUE
    if($CONEXAO->nlinhas() > 0){
    return true;
    }else{
    return false;
    }

    }
    function diaUtil($data){

    while(true){

    if(getDayOfWeek($data) == ‘Sábado’){

    $data = $data + (86400 * 2);
    return diaUtil($data);

    }else if(getDayOfWeek($data) == ‘Domingo’){

    $data = $data + (86400 * 1);
    return diaUtil($data);

    }else if(Feriado($data) == true){
    $data = $data + (86400 * 1);
    return diaUtil($data);
    }
    else{
    return $data;
    }

    }

    }
    $dataHoje = time();
    $proximoDiaUtil = diaUtil($dataHoje);
    $proximoDiaUtil = date(‘d/m/Y’,$proximoDiaUtil );

    echo $proximoDiaUtil;
    ?>

Faça um comentário

*

Facebook Auto Publish Powered By : XYZScripts.com