Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Renato Duarte

[Resolvido] Gerenciamento de datas

Recommended Posts

Bom dia, comunidade!

 

 

Estou precisando destacar as ordem de serviço que foram criadas há mais de 30 dias e ainda não foram quitadas. A data de vencimento no MySQL está dessa forma: 2010-10-01

Pensei em algo asssim:

 

$dataVenc = '2010-10-01';
$numDias = 30;
if ($dataVenc > $numDias)
 echo 'é só fazer o destaque em CSS';

O problema é que não funciona dessa forma. Como eu transformo $dataVenc em timestamp Unix e como eu faria a comparação?

 

Outra coisa, dei uma pesquisada e cheguei a duas funções que retiram 30 dias de uma data, mas elas diferem uma da outra.

Dá o valor 3600 de diferença.

 echo $um = time() - (30*24*60*60);
 echo '
';
 echo $dois = strtotime('-30 days');
	echo '
';
 echo $dois - $um;

Então, em resumo, a minha necessidade é descobrir quando uma data no formato 0000-00-00 tem mais de 30 dias em relação a data atual.

Obrigado, antecipadamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, uma forma bacana que costumo usar para calcular datas é o mktime()

 

http://www.php.net/mktime

 

Desta forma fica facil fazer contas com datas ex:

A função que fiz abaixo calcula a diferença entre duas datas em meses, dias, horas e minutos.

Basta você passar os parametros.

 

/****
* Aqui uso uma função que pega a diferença entre duas datas
* passamos quatro parametros, a data maior, a data menor, o
* caracter separador e o tipo de diferença que será utilizado
* e obtemos o resultado desejado em seguida
****/
function diffDays($dateB, $dateS, $sep, $type=''){
    $date1 = explode($sep, $dateB);
    $date2 = explode($sep, $dateS);
    switch ($type) {
        case 'months':
            $Q = 2592000;
        break;
        case 'days':
            $Q = 86400;
        break;
        case 'hours':
            $Q = 3600;
        break;
        case 'minutes':
            $Q = 60;
        break;
        default:
            $Q = 1;
    }
    return floor(((mktime(0,0,0,$date1[1],$date1[2],$date1[0])-mktime(0,0,0,$date2[1],$date2[2],$date2[0]))/$Q));
}
Observe no return que eu diminuo um mktime do outro usando datas que vem pelo parametro no formato yyyy-mm-dd.

 

Sendo assim para se ter a diferença de dias de uma data a outra basta fazer:

 

$dataMaior = '2010-11-01';
$dataMenor = '2010-10-01';
$separador = '-';
$tipo = 'days';
$diferenca = diffDays($dataMaior, $dateMenor, $separador, $tipo);
Espero que está função possa te ajudar em algo.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Renato acesse o link que coloquei no primeiro post

referente ao php.net.

 

Neste link é explicado perfeitamente como a função mktime funciona.

 

Vou te dar mais alguns exemplos.

 

echo date("d/m/Y",mktime(0,0,0,11,01,2010)); //Data de hoje no formato dd/mm/yyyy
echo date("d/m/Y",mktime(0,0,0,date('m'),date('d'),date('Y')); //Data de hoje no formato dd/mm/yyyy
echo date("Y-m-d",mktime(0,0,0,date('m'),(date('d')-30),date('Y')); //Data de hoje menos 30 dias formato yyyy-mm-dd
Acredito que acessando o link e testando os exemplos que te dei vai ficar mais fácil de entender a função mktime.

 

Lembrando que a minha função na linha do return faz mktime()-mktime() que pega duas datas como a do exemplo acima e diminui uma pela outra. Depois eu divido pelo $Q para obter a diferença da forma desejada.

 

Da uma estudada na função mktime() com o link e os exemplos que te passei que você vai entender melhor como solucionar este problema.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Novamente agradeço a sua atenção em responder.

Já tinha até dado uma olhada no link de mktime, mas ainda não sabia como colocar a data atual de forma dinâmica dentro da função.

 

Cheguei na solução abaixo e gostaria de saber se está correto da forma que fiz porque, se tiver ok, já resolve o meu problema. Abraço, sucesso pra você.

 

$dataBanco = '2010-10-01';
$partes = explode('-', $dataBanco);
$dataBancoMktime = mktime(0, 0, 0, $partes[1], $partes[2], $partes[0]);

$dia = date('d');
$mes = date('m'); 
$ano = date('Y');
$dataAtualMktime = mktime(0,0,0,$mes,$dia,$ano); 

if (($dataAtualMktime - $dataBancoMktime) >= 2592000)
 echo 'A ordem de serviço está vencida a pelo menos 30 dias';
else
 echo 'A ordem de serviço está dentro do prazo esperado para recebimento.';

Compartilhar este post


Link para o post
Compartilhar em outros sites

Renato da forma que está está errado pois tem de ser data atual - data do banco dividido

por 2592000. Mas agora que você entendeu como funciona, não seria mais fácil usar a minha função?

 

Basta você copiar ela e colar e depois chama-la conforme exemplifiquei:

 

$dataAtual = date('Y-m-d'); //data atual
$dataBanco = '2010-10-01'; //data do banco de dados
$separador = '-'; //separador usado entre ano mes e dia
$tipo = 'months'; //tipo da diferença neste caso em meses
$diferenca = diffDays($dataAtual, $dataBanco, $separador, $tipo); //diferença entre as datas
Assim se $diferença for = 1 significa que você tem um mes de diferença.

Acredito eu que fica bem mais organizado seu código se for feito desta forma

alem do que a função te traz diferença em meses, dias, horas e minutos bastanto apenas

mudar $tipo para a diferença desejada. Sem falar que ela vai te dar a diferença exata em

qualquer um dos tipos que escolher.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.