Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal,
Depois de algum tempo estudando a manipulação de datas no php, assunto que creio dá muita dor de cabeça, principalmente a quem tá iniciando e precisa executar tarefas como somar e subtrair datas, resolvi postar aqui algumas funções que escrevi para facilitar a minha vida no desenvolvimento dos meus sistemas.
Vamos lá!
Conversão de formatos de data:
/ FORMATO DE DATA /
Function Geral_Data($Data = '', $Entrada = 'M', $Saida = 'L')
{
# M => MySQL (formato do banco de dados)
# L => Local (formato do Brasil)
# P => PHP (formato usado nas comparacoes e operacoes de data)
// Validacao
$Formatos = Array('M', 'L', 'P');
If (empty($Data) || !is_string($Data) || $Entrada == $Saida || !in_array($Entrada, $Formatos) || !in_array($Saida, $Formatos))
{ Return $Data; }
// Conversao
Switch ($Entrada)
{ Case 'L':
$Data = explode('/', $Data);
Switch ($Saida)
{ Case 'P': $RT = $Data[1].'/'.$Data[0].'/'.$Data[2]; Break;
Case 'M': $RT = $Data[2].'-'.$Data[1].'-'.$Data[0]; Break; }
Break;
Case 'M':
$Data = explode('-', $Data);
Switch ($Saida)
{ Case 'P': $RT = $Data[1].'/'.$Data[2].'/'.$Data[0]; Break;
Case 'L': $RT = $Data[2].'/'.$Data[1].'/'.$Data[0]; Break; }
Break;
Case 'P':
$Data = explode('/', $Data);
Switch ($Saida)
{ Case 'L': $RT = $Data[1].'/'.$Data[0].'/'.$Data[2]; Break;
Case 'M': $RT = $Data[2].'-'.$Data[0].'-'.$Data[1]; Break; }
Break;
}
Return $RT;
}
Está é útil quando precisamos converter as datas para os formatos do MySQL (Hoje é 2010-09-03) -para, por exemplo gravar no db e depois poder consultar períodos-, PHP (Hoje é 09/03/2010) -formato usado pelas funcoes de tratamento de data do php como mktime()- ou local (Hoje é 03/09/2010).
Conversão data/hora em Timestamp:
Function Geral_DataTS($Data = '', $Soma_Dia = 0, $Soma_Mes = 0, $Soma_Ano = 0, $Hora = '', $Soma_Hora = 0, $Soma_Minuto = 0, $Soma_Segundo = 0)
{
// Validacao
If (!Geral_ValidaData($Data) || (!empty($Hora) && !Geral_ValidaHora($Hora)))
{ Return 0; }
// Converte para o formato PHP
$Data = Geral_Data($Data, 'L', 'P');
$Data = explode('/', $Data); { $RT = mktime(0, 0, 0, $Data[0] + $Soma_Mes, $Data[1] + $Soma_Dia, $Data[2] + $Soma_Ano);
} Else { $Hora = explode(':', $Hora);
$RT = mktime($Hora[0] + $Soma_Hora, $Hora[1] + $Soma_Minuto, $Hora[2] + $Soma_Segundo, $Data[0] + $Soma_Mes, $Data[1] + $Soma_Dia, $Data[2] + $Soma_Ano); }
Return $RT;
}Exemplo:
<?
$Hoje = date('d/m/Y');
$Agora = Geral_DataTS($Hoje, 0, 0, 0);// Se Passaram -> Valores TS devem ser divididos por 86400
$Passou = ($Amanha - $Agora) / 86400;
Echo 'De '.Geral_TSData($Agora, 'L', 'Data').' para '.Geral_TSData($Amanha, 'L', 'Data').' passou '.$Passou.' dia(s).';
?>Conversão de Timestamp em data (novamente, após cálculos, por exemplo):
Function Geral_TSData($TS = 0, $Saida = 'L', $RT_Forma = 'Data')
{
# M => MySQL (formato do banco de dados)
# L => Local (formato do Brasil)
# P => PHP (formato usado nas comparacoes e operacoes de data)# String => data e hora (se houver) numa string unica
# Data => somente a data no formato de saida
# Hora => somente a hora
# Array => Array com data e hora separados
Switch ($RT_Forma)
{ Case 'String':
Switch ($Saida)
{ Case 'L': $RT = date('d/m/Y H:i:s', $TS); Break;
Case 'P': $RT = date('m/d/Y H:i:s', $TS); Break;
Case 'M': $RT = date('Y-m-d H:i:s', $TS); Break;
Default: $RT = date('d/m/Y H:i:s', $TS); }
Break;
Case 'Data':
Switch ($Saida)
{ Case 'L': $RT = date('d/m/Y', $TS); Break;
Case 'P': $RT = date('m/d/Y', $TS); Break;
Case 'M': $RT = date('Y-m-d', $TS); Break;
Default: $RT = date('d/m/Y H:i:s', $TS); }
Break;
Case 'Hora':
$RT = date('H:i:s', $TS);
Break;
Case 'Array':
Switch ($Saida)
{ Case 'L': $RT['Data'] = date('d/m/Y', $TS); Break;
Case 'P': $RT['Data'] = date('m/d/Y', $TS); Break;
Case 'M': $RT['Data'] = date('Y-m-d', $TS); Break;
Default: $RT['Data'] = date('d/m/Y H:i:s', $TS); }
$RT['Hora'] = date('H:i:s', $TS);
Break;
}
Return $RT;
}Validação:
/ DATA => Deve ser passado em formato local com "/" /
Function Geral_ValidaData($Data = '')
{
If (empty($Data) || !is_string($Data))
{ Return 0; }
$Data = explode('/', $Data);
If (!checkdate($Data[1], $Data[0], $Data[2]))
{ Return 0; } Else { Return 1; }
}
/ HORA => Deve ser passado em formato local com ":" /
Function Geral_ValidaHora($Hora = '')
{
If (empty($Hora) || !is_string($Hora) || strpos($Hora, ':') === False)
{ Return 0; }
$Hora = explode(':', $Hora);
If ((!is_numeric($Hora[0]) || $Hora[0] < 0 || $Hora[0] > 60) || (!is_numeric($Hora[1]) || $Hora[1] < 0 || $Hora[1] > 60) || (!is_numeric($Hora[2]) || $Hora[2] < 0 || $Hora[2] > 60))
{ Return 0; } Else { Return 1; }
}
É isso ai, espero ajudar a quem tem pro ai com as datas! Se alguém se dispuser a transformar tudo isso numa classe, acho que facilitará mais pra os iniciantes. Post ai o que achou, erros ou sugestões para melhorar! Abraço a todos, até a próxima.
Fernando.
:D
Carregando comentários...