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:
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.
Pergunta
Fernando Lima (IPIS)
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.