La funcion DateDiff De Visual Basic(VBScript) es muy util al momento de hacer calculos de intervalos entre dos fechas. PHP por desgracia no cuenta con esta una función para realizar la tarea.
Bien una vez explicado esto me he encontrado con la funcion que ven debajo del post esta basada en la funcion DateDiff de VB. Esta funcion cuenta con 4 Argumentos:
La primera determina lo que se desea obtener, ya sea la diferencia entre las fechas de años, meses, trimestres, etc – y los valores permitidos de esta se ponen como primer parametro de la funcion. Los siguientes dos parametros son las fechas que se desean comparar. Cualquier fecha válida debería funcionar correctamente. También se puede utilizar los timestamps, aunque si lo hace, debe enviar el último de los cuatro argumentos como «true». Y la función se llamaria de este modo:
echo datediff('w', '9 July 2003', '4 March 2004', false);
Esto nos dirá el número de días de la semana entre el 9 de julio de 2003 y el 4 de marzo de 2004.
Para que encuentres una version mejor de esta funcion te recomiendo visites la pagina del author ya que entre los comentarios podras encontrar una version actualizada ya que la actual contiene algunos bugs.
- <?php
- function datediff($interval, $datefrom, $dateto, $using_timestamps = false) {
- /*
- $interval can be:
- yyyy - Number of full years
- q - Number of full quarters
- m - Number of full months
- y - Difference between day numbers
- (eg 1st Jan 2004 is "1", the first day. 2nd Feb 2003 is "33". The datediff is "-32".)
- d - Number of full days
- w - Number of full weekdays
- ww - Number of full weeks
- h - Number of full hours
- n - Number of full minutes
- s - Number of full seconds (default)
- */
- if (!$using_timestamps) {
- $datefrom = strtotime($datefrom, 0);
- $dateto = strtotime($dateto, 0);
- }
- $difference = $dateto - $datefrom; // Difference in seconds
- switch($interval) {
- case 'yyyy': // Number of full years
- $years_difference = floor($difference / 31536000);
- if (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom), date("j", $datefrom), date("Y", $datefrom)+$years_difference) > $dateto) {
- $years_difference--;
- }
- if (mktime(date("H", $dateto), date("i", $dateto), date("s", $dateto), date("n", $dateto), date("j", $dateto), date("Y", $dateto)-($years_difference+1)) > $datefrom) {
- $years_difference++;
- }
- $datediff = $years_difference;
- break;
- case "q": // Number of full quarters
- $quarters_difference = floor($difference / 8035200);
- while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($quarters_difference*3), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
- $months_difference++;
- }
- $quarters_difference--;
- $datediff = $quarters_difference;
- break;
- case "m": // Number of full months
- $months_difference = floor($difference / 2678400);
- while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($months_difference), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
- $months_difference++;
- }
- $months_difference--;
- $datediff = $months_difference;
- break;
- case 'y': // Difference between day numbers
- $datediff = date("z", $dateto) - date("z", $datefrom);
- break;
- case "d": // Number of full days
- $datediff = floor($difference / 86400);
- break;
- case "w": // Number of full weekdays
- $days_difference = floor($difference / 86400);
- $weeks_difference = floor($days_difference / 7); // Complete weeks
- $first_day = date("w", $datefrom);
- $days_remainder = floor($days_difference % 7);
- $odd_days = $first_day + $days_remainder; // Do we have a Saturday or Sunday in the remainder?
- if ($odd_days > 7) { // Sunday
- $days_remainder--;
- }
- if ($odd_days > 6) { // Saturday
- $days_remainder--;
- }
- $datediff = ($weeks_difference * 5) + $days_remainder;
- break;
- case "ww": // Number of full weeks
- $datediff = floor($difference / 604800);
- break;
- case "h": // Number of full hours
- $datediff = floor($difference / 3600);
- break;
- case "n": // Number of full minutes
- $datediff = floor($difference / 60);
- break;
- default: // Number of full seconds (default)
- $datediff = $difference;
- break;
- }
- return $datediff;
- }
- ?>
Leave A Comment
You must be logged in to post a comment.