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.

  1. <?php
  2.  
  3. function datediff($interval, $datefrom, $dateto, $using_timestamps = false) {
  4. /*
  5. $interval can be:
  6. yyyy - Number of full years
  7. q - Number of full quarters
  8. m - Number of full months
  9. y - Difference between day numbers
  10. (eg 1st Jan 2004 is "1", the first day. 2nd Feb 2003 is "33". The datediff is "-32".)
  11. d - Number of full days
  12. w - Number of full weekdays
  13. ww - Number of full weeks
  14. h - Number of full hours
  15. n - Number of full minutes
  16. s - Number of full seconds (default)
  17. */
  18.  
  19. if (!$using_timestamps) {
  20. $datefrom = strtotime($datefrom, 0);
  21. $dateto = strtotime($dateto, 0);
  22. }
  23. $difference = $dateto - $datefrom; // Difference in seconds
  24.  
  25. switch($interval) {
  26.  
  27. case 'yyyy': // Number of full years
  28.  
  29. $years_difference = floor($difference / 31536000);
  30. if (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom), date("j", $datefrom), date("Y", $datefrom)+$years_difference) > $dateto) {
  31. $years_difference--;
  32. }
  33. if (mktime(date("H", $dateto), date("i", $dateto), date("s", $dateto), date("n", $dateto), date("j", $dateto), date("Y", $dateto)-($years_difference+1)) > $datefrom) {
  34. $years_difference++;
  35. }
  36. $datediff = $years_difference;
  37. break;
  38.  
  39. case "q": // Number of full quarters
  40.  
  41. $quarters_difference = floor($difference / 8035200);
  42. while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($quarters_difference*3), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
  43. $months_difference++;
  44. }
  45. $quarters_difference--;
  46. $datediff = $quarters_difference;
  47. break;
  48.  
  49. case "m": // Number of full months
  50.  
  51. $months_difference = floor($difference / 2678400);
  52. while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($months_difference), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
  53. $months_difference++;
  54. }
  55. $months_difference--;
  56. $datediff = $months_difference;
  57. break;
  58.  
  59. case 'y': // Difference between day numbers
  60.  
  61. $datediff = date("z", $dateto) - date("z", $datefrom);
  62. break;
  63.  
  64. case "d": // Number of full days
  65.  
  66. $datediff = floor($difference / 86400);
  67. break;
  68.  
  69. case "w": // Number of full weekdays
  70.  
  71. $days_difference = floor($difference / 86400);
  72. $weeks_difference = floor($days_difference / 7); // Complete weeks
  73. $first_day = date("w", $datefrom);
  74. $days_remainder = floor($days_difference % 7);
  75. $odd_days = $first_day + $days_remainder; // Do we have a Saturday or Sunday in the remainder?
  76. if ($odd_days > 7) { // Sunday
  77. $days_remainder--;
  78. }
  79. if ($odd_days > 6) { // Saturday
  80. $days_remainder--;
  81. }
  82. $datediff = ($weeks_difference * 5) + $days_remainder;
  83. break;
  84.  
  85. case "ww": // Number of full weeks
  86.  
  87. $datediff = floor($difference / 604800);
  88. break;
  89.  
  90. case "h": // Number of full hours
  91.  
  92. $datediff = floor($difference / 3600);
  93. break;
  94.  
  95. case "n": // Number of full minutes
  96.  
  97. $datediff = floor($difference / 60);
  98. break;
  99.  
  100. default: // Number of full seconds (default)
  101.  
  102. $datediff = $difference;
  103. break;
  104. }
  105.  
  106. return $datediff;
  107.  
  108. }
  109.  
  110. ?>