Views: 4.226 views
Friends,
Good night!
This post is intended for you PHP programmers who are having trouble adding and subtracting dates and times in PHP. I have prepared a small class to help them overcome this problem. Come on:
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 ) ) ); } } ?> |
To work with date manipulation, once again, it's very simple:
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 |
Let's play with time manipulation now:
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 |
And finally, we will use the function of adding business days. Unlike the addDays function, it only adds business days to the date:
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 |
See you!