Meses/Días/Horas restantes (Diferencia de Fecha/Hora) en PHP

Diciembre 15th, 2009

No Gravatar

He buscado bastante en internet por un script que me permita determinar la diferencia entre dos fechas en PHP. Obtuve resultados que me decian “250 dias, 14 horas, 12 minutos” u otros que requerian la clase de “DateTime” usando la funcion estatica diff.

Sin embargo, en mi caso yo requeria una solución implementable en cualquier version de PHP del 5 para arriba. Y no encontré un solo script que me diera lo que requería: Faltan 5 meses, 2 días, 4 horas.

Por lo tanto desarrollé el siguiente script, tomando como ejemplo uno que encontré en la web, y modificandolo para proveer lo que requería que me devolviera. Si te gusta, o si consideras que pudieras mejorarlo aún mas, se aceptan comentarios.

= $uts['start'] )
        {
            //This extracts the total amount of Days, Hours, Minutes
            $diff = $uts['end'] - $uts['start'];
            if ($days=intval((floor($diff/86400))))
                $diff = $diff % 86400;
            if ($hours=intval((floor($diff/3600))))
                $diff = $diff % 3600;
            if ($minutes=intval((floor($diff/60))))
                $diff = $diff % 60;
            $diff = intval( $diff );    
 
            //Gather separate variables
            $start_year = intval(date("Y", $uts['start']));
            $start_month = intval(date("n", $uts['start']));
            $start_day = intval(date("j", $uts['start']));
            $start_hour = intval(date("H", $uts['start']));
            $end_year = intval(date("Y", $uts['end']));
            $end_month = intval(date("n", $uts['end']));
            $end_day = intval(date("j", $uts['end']));
            $end_hour = intval(date("H", $uts['end']));
            $end_daysinmonth = intval(date("t", $uts['end']));
 
            //Get the Difference in Years and Months
            $diff_years = $end_year - $start_year;
            $diff_months = ($diff_years > 0) ? (($diff_years * 12) - abs($end_month - $start_month)) : abs($end_month - $start_month);
 
            //Calculate Difference in Days
            $curr_month = $start_month;
            $curr_year = $start_year;
            $diff_days = $days;
            for ($y = 0; $y < $diff_months; $y++)
            {
                $days_this_month = intval(date("t", mktime(0,0,0,$curr_month,1,$curr_year)));
                $diff_days -= $days_this_month;
 
                $curr_month++;
                if ($curr_month == 13)
                {
                    $curr_month = 1;
                    $curr_year++;
                }
            }
 
            //Pass on the Difference in Hours
            $diff_hours = $hours;
 
            //Format the Data
            if ($digits == true)
            {
                $diff_months = sprintf('%02d', $diff_months);
                $diff_days = sprintf('%02d', $diff_days);
                $diff_hours = sprintf('%02d', $diff_hours);
                $days = sprintf('%02d', $days);
                $minutes = sprintf('%02d', $minutes);
                $diff =sprintf('%02d', $diff);
            }
 
            //Return the Data
            $returnarray = array('months'=>$diff_months, 'daysmonth'=>$diff_days, 'days'=>$days, 'hours'=>$diff_hours, 'minutes'=>$minutes, 'seconds'=>$diff);
            return( $returnarray );
        }
        else
        {
            //Error: Start Date is Greater than End Date
            $returnarray = array('months'=>0, 'daysmonth'=>0, 'days'=>0, 'hours'=>0, 'minutes'=>0, 'seconds'=>0);
            return($returnarray);
        }
    }
    else
    {
        trigger_error("Invalid date/time data detected", E_USER_WARNING);
    }
    return(false);
}
?>
<div id="countdown">
<h2>Ya llegamos? No, pero en:</h2>
<ul id="countdown_tiempo">
	<li> Meses</li>
	<li> Dias</li>
	<li> Horas</li>
</ul>
</div>

Categorías: PHP, Programación, Tutorials

Etiquetas: , , , , , , , , , , Dejar un comentario

Feed de comentarios6 comentarios

  1. marcosberblesNo Gravatar

    Hola buscando encontré esto, ojalá que a alguien le sirva, si usa MySQL

    http://www.forosdelweb.com/f86/datediff-parecido-sacar-minutos-segundos-760689/

    Saludos!!!

  2. lemiffeNo Gravatar

    Que tal Marcos!

    Muchas gracias por habernos dejado el comentario.

    De hecho cuando hice este script de arriba me encontré con el que has mencionado, sin embargo, en algunos casos sería mejor evitar hacer una base de datos cuando todo se debería poder hacer desde PHP.

    De hecho debería haber un DATEDIFF de forma nativa en PHP… Esperemos que para PHP 6 lo haya.

  3. Carlos ColoradoNo Gravatar

    mmm bueno sobre tu argumento de un metodo qeu sea implementable en php 5 o superior
    DateTime::diff (PHP 5 >= 5.3.0)
    Tal vez te sea mas portable comvertir una fecha a un unix timestamp ( funciona en windows)

    http://php.net/manual/es/function.mktime.php
    Regresa un numero entero que representa a una fecha con presicion a segundos. a la cual se le puede aplicar la aritmetica simple.

    $dateA = array(”H” => 13, …..”Y” => 2009 );
    $dateB = array(”H” => 10, …..”Y” => 2009 );
    $timeA = mktime($dateA);
    $timeB = mktime($dateB);

    $date_dif = $timeA – $timeB;
    echo date(’H', $date_dif); // imprime 2 (por 2 horas)

    Los intervalos los puedes calcular facilmente

    $MIN = 60;
    $HOR = 60*$MIN;
    $DAY = 42*$HOR;
    etc etc

    echo date(’H-m-s Y-m-d’, ‘$timeA+$DAY); //imprime la fecha actual mas 1 dia.

    De esta manera puedes hacer tu operacion en mucho menos lineas y de una manera reutilizable, para restas sumas etc.

    Saludos

  4. lemiffeNo Gravatar

    Muchas gracias por tu comentario Carlos, lo probaré próximamente a ver que tal funciona. Es bastante bueno que requiera menos líneas para funcionar.

    Estuve buscando un tiempo en internet por algo mas simple como esto, sin embargo, la mayoría de los sitios en inglés daban métodos muy complejos como el que usé, o métodos que hacían una llamada a la base de datos lo cual no quería hacer.

    Gracias nuevamente, seguro será muy útil!

  5. Carlos ColoradoNo Gravatar

    Je. No pense que fueras a contestar tan rapido. Como quiera me alegro que te pueda ser de utilidad

  6. tutorialNo Gravatar

    Puede ayudar http://www.vertutoriales.com/index.px.php/tag/php/ goodbye

Dejar un comentario

Feed

http://mtycoders.com / Meses/Días/Horas restantes (Diferencia de Fecha/Hora) en PHP