Post Views 4,415 views
Amigos,
Boa noite!
Esse post é destinado para vocês, programadores PHP, que estão encontrando dificuldades para somar e subtrair datas e horas no PHP. Preparei uma pequena classe para ajudá-los a vencer esse problema. Vamos lá:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 |
<?php class clsData { public static function adicionarDias( $data, $quantidade, $strIntervalo = "d", $bolRetornaDiaUtil = false, $bolSabadoDiaUtil = false ) { $dia = null; $mes = null; $ano = null; $hora = null; $minuto = null; $segundo = null; $vetor = explode( "/", $data ); if ( count( $vetor ) == 3 ) { /* dd/mm/aaaa */ $dia = $vetor[0]; $mes = $vetor[1]; $ano = $vetor[2]; } else { /* aaaa-mm-dd */ $vetor = explode( "-", $data ); $dia = $vetor[2]; $mes = $vetor[1]; $ano = $vetor[0]; } /* Hora */ if ( strlen( $data ) > 10 ) { $horaData = substr( $data, 10 ); $vetorHora = explode( ":", $horaData ); $hora = $vetorHora['0']; $minuto = $vetorHora['1']; $segundo = $vetorHora['2']; } switch ( $strIntervalo ) { case "y": { $ano += $quantidade; break; } case "m": { $mes += $quantidade; break; } case "h": { $hora += $quantidade; break; } case "i": { $minuto += $quantidade; break; } case "s": { $segundo += $quantidade; break; } case "d": default: { $dia += $quantidade; break; } } $novaData = mktime( $hora, $minuto, $segundo, $mes, $dia, $ano ); if ( $bolRetornaDiaUtil ) { $diaSemana = date( "w", $novaData ); if ( $diaSemana == 0 ) { $novaData = mktime( $hora, $minuto, $segundo, $mes, $dia + 1, $ano ); } if ( !$bolSabadoDiaUtil ) { if ( $diaSemana == 6 ) { $novaData = mktime( $hora, $minuto, $segundo, $mes, $dia + 2, $ano ); } } } $dataFormatada = null; if ( in_array( $strIntervalo, array("h", "i", "s") ) ) { $dataFormatada = strftime( "%d/%m/%Y %H:%M:%S", $novaData ); } else { $dataFormatada = strftime( "%d/%m/%Y", $novaData ); } return $dataFormatada; } public static function adicionarHoras( $hora, $quantidade, $strIntervalo = "h", $bolRetornaSegundos = false ) { $vetor = explode( ":", $hora ); $hora = $vetor[0]; $minuto = $vetor[1]; $segundo = (count( $vetor ) == 3) ? $vetor[2] : 0; switch ( $strIntervalo ) { case "h": { $hora += $quantidade; break; } case "m": { $minuto += $quantidade; break; } case "s": { $segundo += $quantidade; break; } } $novaHora = mktime( $hora, $minuto, $segundo, 0, 0, 0 ); if ( $bolRetornaSegundos ) { return strftime( "%H:%M:%S", $novaHora ); } else { return strftime( "%H:%M", $novaHora ); } } public static function adicionarDiasUteis( $data, $dias, $bolSabadoDiaUtil = false ) { /* Caso seja informado uma data do MySQL do tipo DATETIME - aaaa-mm-dd 00:00:00 Transforma para DATE - aaaa-mm-dd */ $data = substr( $data, 0, 10 ); /* Se a data estiver no formato brasileiro: dd/mm/aaaa Converte-a para o padrão americano: aaaa-mm-dd */ if ( preg_match( "@/@", $data ) == 1 ) { $data = implode( "-", array_reverse( explode( "/", $data ) ) ); } $array_data = explode( '-', $data ); $intContador = 1; $intContadorDiasUteis = 1; $intDias = abs( $dias ); while ( $intContadorDiasUteis < $intDias ) { $dia_da_semana = date( 'w', strtotime( '+' . $intContador . ' day', mktime( 0, 0, 0, $array_data[1], $array_data[2], $array_data[0] ) ) ); if ( $dia_da_semana == '6' ) { if ( $bolSabadoDiaUtil ) { $intContadorDiasUteis++; } } else if ( $dia_da_semana != '0' ) { $intContadorDiasUteis++; } $intContador++; } $strSinal = ($dias >= 0) ? "+" : "-"; return date( 'd/m/Y', strtotime( $strSinal . $intContador . ' day', strtotime( $data ) ) ); } } ?> |
Para trabalharmos com a manipulação de datas, mais uma vez, é bem simples:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//Carregamos a classe require_once("classes/clsData.php"); $data = "06/06/2014"; //Pode ser no formato aaaa-mm-dd também //Vamos somar 15 dias echo clsData::adicionarDias($data, 15, "d"); //Vai exibir na tela a data 21/06/2014 //Vamos subtrair 6 dias echo clsData::adicionarDias($data, -6, "d"); //Vai exibir na tela a data 31/05/2014 //Vamos adicionar 1 dia, mas retornar apenas uma data que seja dia útil echo clsData::adicionarDias($data, 1, "d", true, false); //Vai exibir na tela a data 09/06/2014, pois dia 07/06 é sábado e 08/06 é domingo. O próximo dia útil é dia 09/06. //Vamos adicionar 1 dia, mas retornar apenas uma data que seja dia útil, considerando sábado como dia útil echo clsData::adicionarDias($data, 1, "d", true, true); //Vai exibir na tela a data 07/06/2014 //Vamos adicionar 2 meses echo clsData::adicionarDias($data, 2, "m"); //Vai exibir na tela a data 06/08/2014 |
Vamos brincar agora com a manipulação de hora:
1 2 3 4 5 6 7 8 9 10 |
//Carregamos a classe require_once("classes/clsData.php"); $hora = "02:57:22"; //Vamos adicionar 2 horas echo clsData::adicionarHoras($hora, 2, "h", true); //Vai exibir na tela 04:57:22 //Vamos adicionar 90 minutos e ignorar os segundos echo clsData::adicionarHoras($hora, 90, "m", false); //Vai exibir na tela 06:27 |
E por fim, vamos utilizar a função de adicionar dias úteis. Diferente a função de adicionarDias, ela adiciona somente dias úteis à data:
1 2 3 4 5 6 7 |
//Carregamos a classe require_once("classes/clsData.php"); $data = "07/06/2014 03:02:22"; //Vamos adicionar 22 dias úteis echo clsData::adicionarDiasUteis($data, 22); //Vai imprimir 08/07/2014 |
Até mais!