PHP: Calculando o intervalo entre duas datas

Para encontrarmos o tempo percorrido entre duas datas, devemos converter cada data em uma imagem de hora, calcular a diferença e, depois, converter a diferença em uma saída legível para nós.

Para isso usaremos a função mktime(), que retorna um timestamp, ou seja, o numero de segundos desde que a época UNIX começou(1 de janeiro de 1970).

Para resolver este problema vamos criar uma função que recebe duas datas e retorna a quantidade tempo percorrido entre elas:

// Determinando um intervalo entre duas datas
// formato: dd/mm/aaaa

function calculaIntervalo($data1,$data2=''){
	// se data2 for omitida, o calculo sera feito ate a data atual
	$data2 = $data2=='' ? date("d/m/Y",mktime()) : $data2;
	
	// separa as datas em dia,mes e ano
	list($dia1,$mes1,$ano1) = explode("/",$data1);
	list($dia2,$mes2,$ano2) = explode("/",$data2);
	
	// so lembrando que o padrao eh MM/DD/AAAA
	$timestamp1 = mktime(0,0,0,$mes1,$dia1,$ano1);
	$timestamp2 = mktime(0,0,0,$mes2,$dia2,$ano2);
	
	// calcula a diferenca em timestamp
	$diferenca = ($timestamp1 > $timestamp2) ? ($timestamp1 - $timestamp2) : ($timestamp2 - $timestamp1);
	
	// retorna o calculo em anos, meses e dias
	return (date("Y",$diferenca)-1970)." anos,".(date("m",$diferenca)-1)." meses e ".(date("d",$diferenca)-1)." dias";

}

2 Comentários on “PHP: Calculando o intervalo entre duas datas”

  1. tenho um período:

    INICIO FIM
    01-01-2009 01-02-2009

    01-03-2009 01-05-2009
    02-05-2009 01-06-2009

    07-08-2009 11-11-2009

    Preciso inserir um novo INICIO, mas ele nao pode estar dentro de um perído.

    Por exemplo: – posso inserir um novo inicio entre 02-02-2009 e fim ate 28-02-2009
    – não posso inserir 15-01-2009, pois está dentro de um período.

  2. Alison Ricardo S. da Silva disse:

    Dei uma otimizada na função, a quem interessar possa ai vai o improvement:

    // Determinando um intervalo entre duas datas
    // formato: dd/mm/aaaa

    function calculaIntervalo($data1,$data2=”){
    // se data2 for omitida, o calculo sera feito ate a data atual
    $data2 = $data2==” ? date(“d/m/Y”,mktime()) : $data2;

    // separa as datas em dia,mes e ano
    list($dia1,$mes1,$ano1) = explode(“/”,$data1);
    list($dia2,$mes2,$ano2) = explode(“/”,$data2);

    // so lembrando que o padrao eh MM/DD/AAAA
    $timestamp1 = mktime(0,0,0,$mes1,$dia1,$ano1);
    $timestamp2 = mktime(0,0,0,$mes2,$dia2,$ano2);

    // calcula a diferenca em timestamp
    $diferenca = ($timestamp1 > $timestamp2) ? ($timestamp1 – $timestamp2) : ($timestamp2 – $timestamp1);

    $str = ”;

    $calc1 = (date(“Y”,$diferenca)-1970);
    $calc2 = (date(“m”,$diferenca)-1);
    $calc3 = (date(“d”,$diferenca)-1);

    if( $calc1 > 0 ){
    $str .= (date(“Y”,$diferenca)-1970).” ano”;
    $str .= ($calc1 == 1)?”:’s’;
    $str .= ‘, ‘;
    }

    if( $calc2 > 0 ){
    $str .= (date(“m”,$diferenca)-1).” m”;
    $str .= ($calc2 == 1)?’ês’:’eses’;
    if ( $calc3 > 0 ){
    $str .= ‘ e ‘;
    }
    }

    if( $calc3 > 0 ){
    $str .= (date(“d”,$diferenca)-1).” dia”;
    $str .= ($calc3 == 1)?”:’s’;
    }

    // retorna o calculo em anos, meses e dias
    return $str;

    }


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s