Calcular diferença entre 2 datas com PHP

  • Autor do post:
  • Categoria do post:PHP DEV

ESSE POST FOI ATUALIZADO EM: http://clares.com.br/2011/01/06/calcular-diferenca-entre-2-datas-com-php/

Por favor visite o link acima, está mais simples !!!

Diferença entre datas com a função mktime()

Um exemplo simples de como calcular a diferença entre 2 datas utilizando o php, como bem sabemos um dia possui 24 horas que equivale a (24 * 60  * 60) igual á 86400.

A função mktime recebe os argumentos (hora, minuto, segundos, mes, dia, ano).

<?php
#setando a primeira data  10/01/2008
$dia1 = mktime(0,0,0,01,10,2008);
#setando segunda data 10/02/2008
$dia2 = mktime(0,0,0,02,10,2008);
#armazenando o valor da subtracao das datas
$d3 = ($dia2$dia1);
#usando o roud para arrendondar os valores
#converter o tempo em dias

$dias = round(($d3/60/60/24));
#converter o tempo em horas
$hrs = round(($d3/60/60));
#converter o tempo em minutos
$mins = round(($d3/60));
#exibindo  dias | repudizira na tela 31
echo $dias.”<br>”;

#exibindo  horas | repudizira na tela 744
echo $hrs.”<br>”;

#exibindo  minutos | repudizira na tela 44640
echo $mins.”<br>”;
?>

Importante lembrar que acima hrs é o total de horas entre as duas datas e o mesmo para minutos.

Para tornar o exemplo útil você precisa setar de forma dinâmica os valores para $dia1 e $dia2, como exemplo imagine que seu sistema grava a data (mktime) de um post e faça o calculo do (diaAtual – diadoPost).

Dica:

Para passar para o formato comum uma data em mktime() use o date como abaixo:
echo date(‘d/m/Y’,$dia2);

Até logo,

Este post tem 13 comentários

  1. Paulo

    Cara, muito boa dica, valeu!

  2. Tata

    É nesse momento que eu paro e penso: “Como é que eu não pensei nisso antes?!?!?!?!”

    xD
    Muito boa dica, TY!!

  3. TCL

    como faço para utilizar o tempo do sistema operacional para calcular o tempo que o usuario permanece na pagina

  4. guilherme

    cara
    que dica EXCELENTE!
    muito obrigado!!!

  5. Marcos

    cara, muito util esse código mesmo, mas deu alguns problemas quanto ao ‘round’ que você deu nas variaveis, seria mais apropriado usar um ‘floor’, que foi o que eu usei aqi e funcionou muito bem.

  6. Paulo

    Muito bom esse código, eu consegui rodá-lo tanto com o ROUND e o FLOOR deram certo! Deu um pequeno erro no “echo $dias.””;
    ” em diante… Resolvi com o corfome segue abaixo:

    PARABÉNS RAFAEL!!!

  7. Fabio Ferreira

    Boas Rafael,
    Andava eu á procura desta função quando o Google me trás aqui novamente! 😀
    eu precisava de uma função para saber os dias úteis da função sem fins de semana nem feriados e o seu post me ajudou muito! Obrigado mais uma vez…

    Deixo aqui a função para quem precisar:

    /**
    * Função que passado uma data conta quantos dias
    * úteis faltam (para datas no futuro) ou se passaram
    * (datas no passado) para o dia de hoje.
    * Se for passado o segundo parâmetro, calcula a diferença entre as duas data.
    **/

    function dias_uteis($datainicial, $datafinal=null) {
    if (!isset($datainicial))
    return false;
    if (!isset($datafinal))
    $datafinal = time();

    $segundos_datainicial = strtotime(preg_replace(“#(d{2})/(d{2})/(d{4})#”, “$3/$2/$1”, $datainicial));
    $segundos_datafinal = strtotime(preg_replace(“#(d{2})/(d{2})/(d{4})#”, “$3/$2/$1″, $datafinal));
    $dias = abs(floor(floor(($segundos_datafinal – $segundos_datainicial) / 3600) / 24));
    $uteis = 0;
    for ($i = 0; $i query($sql1);
    $totaldias = $db1->numRows();
    while ($db1->nextRecord()) {
    $w=$db1->getField(‘acti_9’);
    }

    if ($w == 0) {
    //echo date(‘d/m/Y’,$diai).” é Domingo”;
    } elseif ($w == 6) {
    //echo date(‘d/m/Y’,$diai).” é Sábado”;
    } else {
    //echo date(‘d/m/Y’,$diai).” é dia útil”;
    $uteis++;
    }
    }
    return $uteis;
    }

  8. tsant

    Não funfou no exemplo abaixo… 🙁

    Alguma idéia???

    #setando a primeira data 28/02/2008
    $dia1 = mktime(0,0,0,28,02,2008);
    #setando segunda data 01/03/2008
    $dia2 = mktime(0,0,0,01,03,2008);
    #armazenando o valor da subtracao das datas
    $d3 = ($dia2-$dia1);
    #usando o roud para arrendondar os valores
    #converter o tempo em dias
    $dias = round(($d3/60/60/24));
    #converter o tempo em horas
    $hrs = round(($d3/60/60));
    #converter o tempo em minutos
    $mins = round(($d3/60));
    echo $dias.”;
    echo $hrs.”;
    echo $mins.”;

  9. Periscuelo

    Abaixo vai um exemplo mais simples e eficiente de trabalhar com diferença entre datas:

    function diffDays($dateB, $dateS, $sep, $type=”){
    $date1 = explode($sep, $dateB);
    $date2 = explode($sep, $dateS);
    switch ($type) {
    case ‘years’:
    $Q = 31104000;
    break;
    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));
    }

    $data1 = ‘2011-01-04’;
    $data2 = ‘2010-12-04′;

    echo diffDays($data1,$data2,’-‘,’days’);

    Basta testar 😉

    1. Rafael Clares

      Valeuuu, vou testar aqui e se for dhora mesmo vou colocar no post.

    1. Rafael Clares

      João, muito obrigado pela contribuição, é sempre bem-vinda! Pena que muitas aplicações são inviáveis para migrar por exemplo do 5 para 5.3 né…
      Valeu, um forte abraço!

Os comentários estão encerrados.