Ir para conteúdo
Fórum Script Brasil
  • 0

Funcões úteis para manipular datas


Fernando Lima (IPIS)

Pergunta

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')
{
# Formatos de Entrada/Saida:
# 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);
If (empty($Hora))
   { $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;
}
Essa é utilíssima quando se trata de executar operações aritiméticas com datas, o Timestamp (data convertida em um valor interior longo) pode ser depois subtraido/somado e assim podemos saber, por exemplo quanto tempo passou de uma data para outra! Legal né? Exemplo:
<?
$Hoje         = date('d/m/Y');
$Agora        = Geral_DataTS($Hoje, 0, 0, 0);
$Amanha       = Geral_DataTS($Hoje, 5, 0, 0); // mais 5 dias

// 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).';
?>
Irá imprimir: "De 03/09/2010 para 08/09/2010 passou 5 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')
{
# Formatos de Saida:
# M => MySQL (formato do banco de dados)
# L => Local (formato do Brasil)
# P => PHP (formato usado nas comparacoes e operacoes de data)
#
# Formatos de Retorno:
# 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;
}
Esta transforma um valor Timestamp em data novamente. Por fim, estas duas são usadas pela funções acima para validar se o valor passado para a função realmente é data e/ou hora válida: 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.

Att.

Fernando.

:D

Editado por Fernando Lima (IPIS)
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...