home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 April / CMCD0404.ISO / Software / Freeware / Programare / dotproject / lib / PEAR / Date / Calc.php next >
PHP Script  |  2003-12-03  |  49KB  |  1,605 lines

  1. <?php
  2.  
  3. // The constant telling us what day starts the week. Monday (1) is the
  4. // international standard. Redefine this to 0 if you want weeks to
  5. // begin on Sunday.
  6. define('DATE_CALC_BEGIN_WEEKDAY', 1);
  7.  
  8. /**
  9.  * Date_Calc is a calendar class used to calculate and
  10.  * manipulate calendar dates and retrieve dates in a calendar
  11.  * format. It does not rely on 32-bit system date stamps, so
  12.  * you can display calendars and compare dates that date
  13.  * pre 1970 and post 2038.
  14.  *
  15.  * This source file is subject to version 2.02 of the PHP license,
  16.  * that is bundled with this package in the file LICENSE, and is
  17.  * available at through the world-wide-web at
  18.  * http://www.php.net/license/2_02.txt.
  19.  * If you did not receive a copy of the PHP license and are unable to
  20.  * obtain it through the world-wide-web, please send a note to
  21.  * license@php.net so we can mail you a copy immediately.
  22.  *
  23.  * Copyright (c) 1999, 2000 ispi
  24.  *
  25.  * @access public
  26.  *
  27.  * @version 1.2.4
  28.  * @author Monte Ohrt <monte@ispi.net>
  29.  */
  30.  
  31. class Date_Calc
  32. {
  33.     /**
  34.      * Returns the current local date. NOTE: This function
  35.      * retrieves the local date using strftime(), which may
  36.      * or may not be 32-bit safe on your system.
  37.      *
  38.      * @param string the strftime() format to return the date
  39.      *
  40.      * @access public
  41.      *
  42.      * @return string the current date in specified format
  43.      */
  44.  
  45.     function dateNow($format="%Y%m%d")
  46.     {
  47.         return(strftime($format,time()));
  48.  
  49.     } // end func dateNow
  50.  
  51.      /**
  52.      * Returns true for valid date, false for invalid date.
  53.      *
  54.      * @param string year in format CCYY
  55.      * @param string month in format MM
  56.      * @param string day in format DD
  57.      *
  58.      * @access public
  59.      *
  60.      * @return boolean true/false
  61.      */
  62.  
  63.     function isValidDate($day, $month, $year)
  64.     {
  65.         if($year < 0 || $year > 9999)
  66.             return false;
  67.         if(!checkdate($month,$day,$year))
  68.             return false;
  69.  
  70.         return true;
  71.     } // end func isValidDate
  72.  
  73.      /**
  74.      * Returns true for a leap year, else false
  75.      *
  76.      * @param string year in format CCYY
  77.      *
  78.      * @access public
  79.      *
  80.      * @return boolean true/false
  81.      */
  82.  
  83.     function isLeapYear($year="")
  84.     {
  85.  
  86.         if(empty($year))
  87.             $year = Date_Calc::dateNow("%Y");
  88.  
  89.         if(strlen($year) != 4)
  90.             return false;
  91.  
  92.         if(preg_match("/\D/",$year))
  93.             return false;
  94.  
  95.         return (($year % 4 == 0 && $year % 100 != 0) || $year % 400 == 0);
  96.  
  97.     } // end func isLeapYear
  98.  
  99.     /**
  100.      * Determines if given date is a future date from now.
  101.      *
  102.      * @param string year in format CCYY
  103.      * @param string month in format MM
  104.      * @param string day in format DD
  105.      *
  106.      * @access public
  107.      *
  108.      * @return boolean true/false
  109.      */
  110.  
  111.     function isFutureDate($day,$month,$year)
  112.     {
  113.         $this_year = Date_Calc::dateNow("%Y");
  114.         $this_month = Date_Calc::dateNow("%m");
  115.         $this_day = Date_Calc::dateNow("%d");
  116.  
  117.  
  118.         if($year > $this_year)
  119.             return true;
  120.         elseif($year == $this_year)
  121.             if($month > $this_month)
  122.                 return true;
  123.             elseif($month == $this_month)
  124.                 if($day > $this_day)
  125.                     return true;
  126.  
  127.         return false;
  128.  
  129.     } // end func isFutureDate
  130.  
  131.     /**
  132.      * Determines if given date is a past date from now.
  133.      *
  134.      * @param string year in format CCYY
  135.      * @param string month in format MM
  136.      * @param string day in format DD
  137.      *
  138.      * @access public
  139.      *
  140.      * @return boolean true/false
  141.      */
  142.  
  143.     function isPastDate($day,$month,$year)
  144.     {
  145.         $this_year = Date_Calc::dateNow("%Y");
  146.         $this_month = Date_Calc::dateNow("%m");
  147.         $this_day = Date_Calc::dateNow("%d");
  148.  
  149.  
  150.         if($year < $this_year)
  151.             return true;
  152.         elseif($year == $this_year)
  153.             if($month < $this_month)
  154.                 return true;
  155.             elseif($month == $this_month)
  156.                 if($day < $this_day)
  157.                     return true;
  158.  
  159.         return false;
  160.  
  161.     } // end func isPastDate
  162.  
  163.     /**
  164.      * Returns day of week for given date, 0=Sunday
  165.      *
  166.      * @param string year in format CCYY, default is current local year
  167.      * @param string month in format MM, default is current local month
  168.      * @param string day in format DD, default is current local day
  169.      *
  170.      * @access public
  171.      *
  172.      * @return int $weekday_number
  173.      */
  174.  
  175.     function dayOfWeek($day="",$month="",$year="")
  176.     {
  177.  
  178.         if(empty($year))
  179.             $year = Date_Calc::dateNow("%Y");
  180.         if(empty($month))
  181.             $month = Date_Calc::dateNow("%m");
  182.         if(empty($day))
  183.             $day = Date_Calc::dateNow("%d");
  184.  
  185.         if($month > 2)
  186.             $month -= 2;
  187.         else
  188.         {
  189.             $month += 10;
  190.             $year--;
  191.         }
  192.  
  193.         $day =     ( floor((13 * $month - 1) / 5) +
  194.                 $day + ($year % 100) +
  195.                 floor(($year % 100) / 4) +
  196.                 floor(($year / 100) / 4) - 2 *
  197.                 floor($year / 100) + 77);
  198.  
  199.         $weekday_number = (($day - 7 * floor($day / 7)));
  200.  
  201.         return $weekday_number;
  202.  
  203.     } // end func dayOfWeek
  204.  
  205.     /**
  206.      * Returns week of the year, first Sunday is first day of first week
  207.      *
  208.      * @param string day in format DD
  209.      * @param string month in format MM
  210.      * @param string year in format CCYY
  211.      *
  212.      * @access public
  213.      *
  214.      * @return integer $week_number
  215.      */
  216.  
  217.     function weekOfYear($day,$month,$year)
  218.     {
  219.         if(empty($year))
  220.             $year = Date_Calc::dateNow("%Y");
  221.         if(empty($month))
  222.             $month = Date_Calc::dateNow("%m");
  223.         if(empty($day))
  224.             $day = Date_Calc::dateNow("%d");
  225.  
  226.         $week_year = $year - 1501;
  227.         $week_day = $week_year * 365 + floor($week_year / 4) - 29872 + 1
  228.                 - floor($week_year / 100) + floor(($week_year - 300) / 400);
  229.  
  230.         $week_number =
  231.                 ceil((Date_Calc::julianDate($day,$month,$year) + floor(($week_day + 4) % 7)) / 7);
  232.  
  233.         return $week_number;
  234.  
  235.     } // end func weekOfYear
  236.  
  237.     /**
  238.      * Returns number of days since 31 December of year before given date.
  239.      *
  240.      * @param string year in format CCYY, default is current local year
  241.      * @param string month in format MM, default is current local month
  242.      * @param string day in format DD, default is current local day
  243.      *
  244.      * @access public
  245.      *
  246.      * @return int $julian
  247.      */
  248.  
  249.     function julianDate($day="",$month="",$year="")
  250.     {
  251.         if(empty($year))
  252.             $year = Date_Calc::dateNow("%Y");
  253.         if(empty($month))
  254.             $month = Date_Calc::dateNow("%m");
  255.         if(empty($day))
  256.             $day = Date_Calc::dateNow("%d");
  257.  
  258.         $days = array(0,31,59,90,120,151,181,212,243,273,304,334);
  259.  
  260.         $julian = ($days[$month - 1] + $day);
  261.  
  262.         if($month > 2 && Date_Calc::isLeapYear($year))
  263.             $julian++;
  264.  
  265.         return($julian);
  266.  
  267.     } // end func julianDate
  268.  
  269.     /**
  270.      * Returns quarter of the year for given date
  271.      *
  272.      * @param string year in format CCYY, default current local year
  273.      * @param string month in format MM, default current local month
  274.      * @param string day in format DD, default current local day
  275.      *
  276.      * @access public
  277.      *
  278.      * @return int $year_quarter
  279.      */
  280.  
  281.     function quarterOfYear($day="",$month="",$year="")
  282.     {
  283.         if(empty($year))
  284.             $year = Date_Calc::dateNow("%Y");
  285.         if(empty($month))
  286.             $month = Date_Calc::dateNow("%m");
  287.         if(empty($day))
  288.             $day = Date_Calc::dateNow("%d");
  289.  
  290.         $year_quarter = (intval(($month - 1) / 3 + 1));
  291.  
  292.         return $year_quarter;
  293.  
  294.     } // end func quarterOfYear
  295.  
  296.     /**
  297.      * Returns date of begin of next month of given date.
  298.      *
  299.      * @param string year in format CCYY, default current local year
  300.      * @param string month in format MM, default current local month
  301.      * @param string day in format DD, default current local day
  302.      * @param string format for returned date
  303.      *
  304.      * @access public
  305.      *
  306.      * @return string date in given format
  307.      */
  308.  
  309.     function beginOfNextMonth($day="",$month="",$year="",$format="%Y%m%d")
  310.     {
  311.         if(empty($year))
  312.             $year = Date_Calc::dateNow("%Y");
  313.         if(empty($month))
  314.             $month = Date_Calc::dateNow("%m");
  315.         if(empty($day))
  316.             $day = Date_Calc::dateNow("%d");
  317.  
  318.         if($month < 12)
  319.         {
  320.             $month++;
  321.             $day=1;
  322.         }
  323.         else
  324.         {
  325.             $year++;
  326.             $month=1;
  327.             $day=1;
  328.         }
  329.  
  330.         return Date_Calc::dateFormat($day,$month,$year,$format);
  331.  
  332.     } // end func beginOfNextMonth
  333.  
  334.     /**
  335.      * Returns date of the last day of next month of given date.
  336.      *
  337.      * @param string year in format CCYY, default current local year
  338.      * @param string month in format MM, default current local month
  339.      * @param string day in format DD, default current local day
  340.      * @param string format for returned date
  341.      *
  342.      * @access public
  343.      *
  344.      * @return string date in given format
  345.      */
  346.  
  347.     function endOfNextMonth($day="",$month="",$year="",$format="%Y%m%d")
  348.     {
  349.         if(empty($year))
  350.             $year = Date_Calc::dateNow("%Y");
  351.         if(empty($month))
  352.             $month = Date_Calc::dateNow("%m");
  353.         if(empty($day))
  354.             $day = Date_Calc::dateNow("%d");
  355.  
  356.  
  357.         if($month < 12)
  358.         {
  359.             $month++;
  360.         }
  361.         else
  362.         {
  363.             $year++;
  364.             $month=1;
  365.         }
  366.  
  367.         $day = Date_Calc::daysInMonth($month,$year);
  368.  
  369.         return Date_Calc::dateFormat($day,$month,$year,$format);
  370.  
  371.     } // end func endOfNextMonth
  372.  
  373.     /**
  374.      * Returns date of the first day of previous month of given date.
  375.      *
  376.      * @param string year in format CCYY, default current local year
  377.      * @param string month in format MM, default current local month
  378.      * @param string day in format DD, default current local day
  379.      * @param string format for returned date
  380.      *
  381.      * @access public
  382.      *
  383.      * @return string date in given format
  384.      */
  385.  
  386.     function beginOfPrevMonth($day="",$month="",$year="",$format="%Y%m%d")
  387.     {
  388.         if(empty($year))
  389.             $year = Date_Calc::dateNow("%Y");
  390.         if(empty($month))
  391.             $month = Date_Calc::dateNow("%m");
  392.         if(empty($day))
  393.             $day = Date_Calc::dateNow("%d");
  394.  
  395.         if($month > 1)
  396.         {
  397.             $month--;
  398.             $day=1;
  399.         }
  400.         else
  401.         {
  402.             $year--;
  403.             $month=12;
  404.             $day=1;
  405.         }
  406.  
  407.         return Date_Calc::dateFormat($day,$month,$year,$format);
  408.  
  409.     } // end func beginOfPrevMonth
  410.  
  411.     /**
  412.      * Returns date of the last day of previous month for given date.
  413.      *
  414.      * @param string year in format CCYY, default current local year
  415.      * @param string month in format MM, default current local month
  416.      * @param string day in format DD, default current local day
  417.      * @param string format for returned date
  418.      *
  419.      * @access public
  420.      *
  421.      * @return string date in given format
  422.      */
  423.  
  424.     function endOfPrevMonth($day="",$month="",$year="",$format="%Y%m%d")
  425.     {
  426.         if(empty($year))
  427.             $year = Date_Calc::dateNow("%Y");
  428.         if(empty($month))
  429.             $month = Date_Calc::dateNow("%m");
  430.         if(empty($day))
  431.             $day = Date_Calc::dateNow("%d");
  432.  
  433.         if($month > 1)
  434.         {
  435.             $month--;
  436.         }
  437.         else
  438.         {
  439.             $year--;
  440.             $month=12;
  441.         }
  442.  
  443.         $day = Date_Calc::daysInMonth($month,$year);
  444.  
  445.         return Date_Calc::dateFormat($day,$month,$year,$format);
  446.  
  447.     } // end func endOfPrevMonth
  448.  
  449.     /**
  450.      * Returns date of the next weekday of given date,
  451.      * skipping from Friday to Monday.
  452.      *
  453.      * @param string year in format CCYY, default current local year
  454.      * @param string month in format MM, default current local month
  455.      * @param string day in format DD, default current local day
  456.      * @param string format for returned date
  457.      *
  458.      * @access public
  459.      *
  460.      * @return string date in given format
  461.      */
  462.  
  463.     function nextWeekday($day="",$month="",$year="",$format="%Y%m%d")
  464.     {
  465.         if(empty($year))
  466.             $year = Date_Calc::dateNow("%Y");
  467.         if(empty($month))
  468.             $month = Date_Calc::dateNow("%m");
  469.         if(empty($day))
  470.             $day = Date_Calc::dateNow("%d");
  471.  
  472.         $days = Date_Calc::dateToDays($day,$month,$year);
  473.  
  474.         if(Date_Calc::dayOfWeek($day,$month,$year) == 5)
  475.             $days += 3;
  476.         elseif(Date_Calc::dayOfWeek($day,$month,$year) == 6)
  477.             $days += 2;
  478.         else
  479.             $days += 1;
  480.  
  481.         return(Date_Calc::daysToDate($days,$format));
  482.  
  483.     } // end func nextWeekday
  484.  
  485.     /**
  486.      * Returns date of the previous weekday,
  487.      * skipping from Monday to Friday.
  488.      *
  489.      * @param string year in format CCYY, default current local year
  490.      * @param string month in format MM, default current local month
  491.      * @param string day in format DD, default current local day
  492.      * @param string format for returned date
  493.      *
  494.      * @access public
  495.      *
  496.      * @return string date in given format
  497.      */
  498.  
  499.     function prevWeekday($day="",$month="",$year="",$format="%Y%m%d")
  500.     {
  501.         if(empty($year))
  502.             $year = Date_Calc::dateNow("%Y");
  503.         if(empty($month))
  504.             $month = Date_Calc::dateNow("%m");
  505.         if(empty($day))
  506.             $day = Date_Calc::dateNow("%d");
  507.  
  508.         $days = Date_Calc::dateToDays($day,$month,$year);
  509.  
  510.         if(Date_Calc::dayOfWeek($day,$month,$year) == 1)
  511.             $days -= 3;
  512.         elseif(Date_Calc::dayOfWeek($day,$month,$year) == 0)
  513.             $days -= 2;
  514.         else
  515.             $days -= 1;
  516.  
  517.         return(Date_Calc::daysToDate($days,$format));
  518.  
  519.     } // end func prevWeekday
  520.  
  521.     /**
  522.      * Returns date of the next specific day of the week
  523.      * from the given date.
  524.      *
  525.      * @param int day of week, 0=Sunday
  526.      * @param string year in format CCYY, default current local year
  527.      * @param string month in format MM, default current local month
  528.      * @param string day in format DD, default current local day
  529.      * @param boolean onOrAfter if true and days are same, returns current day
  530.      * @param string format for returned date
  531.      *
  532.      * @access public
  533.      *
  534.      * @return string date in given format
  535.      */
  536.  
  537.     function nextDayOfWeek($dow,$day="",$month="",$year="",$format="%Y%m%d",$onOrAfter=false)
  538.     {
  539.         if(empty($year))
  540.             $year = Date_Calc::dateNow("%Y");
  541.         if(empty($month))
  542.             $month = Date_Calc::dateNow("%m");
  543.         if(empty($day))
  544.             $day = Date_Calc::dateNow("%d");
  545.  
  546.         $days = Date_Calc::dateToDays($day,$month,$year);
  547.         $curr_weekday = Date_Calc::dayOfWeek($day,$month,$year);
  548.  
  549.         if($curr_weekday == $dow)
  550.         {
  551.             if(!$onOrAfter)
  552.                 $days += 7;
  553.         }
  554.         elseif($curr_weekday > $dow)
  555.             $days += 7 - ( $curr_weekday - $dow );
  556.         else
  557.             $days += $dow - $curr_weekday;
  558.  
  559.         return(Date_Calc::daysToDate($days,$format));
  560.  
  561.     } // end func nextDayOfWeek
  562.  
  563.     /**
  564.      * Returns date of the previous specific day of the week
  565.      * from the given date.
  566.      *
  567.      * @param int day of week, 0=Sunday
  568.      * @param string year in format CCYY, default current local year
  569.      * @param string month in format MM, default current local month
  570.      * @param string day in format DD, default current local day
  571.      * @param boolean onOrBefore if true and days are same, returns current day
  572.      * @param string format for returned date
  573.      *
  574.      * @access public
  575.      *
  576.      * @return string date in given format
  577.      */
  578.  
  579.     function prevDayOfWeek($dow,$day="",$month="",$year="",$format="%Y%m%d",$onOrBefore=false)
  580.     {
  581.         if(empty($year))
  582.             $year = Date_Calc::dateNow("%Y");
  583.         if(empty($month))
  584.             $month = Date_Calc::dateNow("%m");
  585.         if(empty($day))
  586.             $day = Date_Calc::dateNow("%d");
  587.  
  588.         $days = Date_Calc::dateToDays($day,$month,$year);
  589.         $curr_weekday = Date_Calc::dayOfWeek($day,$month,$year);
  590.  
  591.         if($curr_weekday == $dow)
  592.         {
  593.             if(!$onOrBefore)
  594.                 $days -= 7;
  595.         }
  596.         elseif($curr_weekday < $dow)
  597.             $days -= 7 - ( $dow - $curr_weekday );
  598.         else
  599.             $days -= $curr_weekday - $dow;
  600.  
  601.         return(Date_Calc::daysToDate($days,$format));
  602.  
  603.     } // end func prevDayOfWeek
  604.  
  605.     /**
  606.      * Returns date of the next specific day of the week
  607.      * on or before the given date.
  608.      *
  609.      * @param int day of week, 0=Sunday
  610.      * @param string year in format CCYY, default current local year
  611.      * @param string month in format MM, default current local month
  612.      * @param string day in format DD, default current local day
  613.      * @param string format for returned date
  614.      *
  615.      * @access public
  616.      *
  617.      * @return string date in given format
  618.      */
  619.  
  620.     function nextDayOfWeekOnOrAfter($dow,$day="",$month="",$year="",$format="%Y%m%d")
  621.     {
  622.         return(Date_Calc::nextDayOfWeek($dow,$day="",$month="",$year="",$format="%Y%m%d",true));
  623.     } // end func nextDayOfWeekOnOrAfter
  624.  
  625.     /**
  626.      * Returns date of the previous specific day of the week
  627.      * on or before the given date.
  628.      *
  629.      * @param int day of week, 0=Sunday
  630.      * @param string year in format CCYY, default current local year
  631.      * @param string month in format MM, default current local month
  632.      * @param string day in format DD, default current local day
  633.      * @param string format for returned date
  634.      *
  635.      * @access public
  636.      *
  637.      * @return string date in given format
  638.      */
  639.  
  640.     function prevDayOfWeekOnOrBefore($dow,$day="",$month="",$year="",$format="%Y%m%d")
  641.     {
  642.         return(Date_Calc::prevDayOfWeek($dow,$day="",$month="",$year="",$format="%Y%m%d",true));
  643.  
  644.     } // end func prevDayOfWeekOnOrAfter
  645.  
  646.     /**
  647.      * Returns date of day after given date.
  648.      *
  649.      * @param string year in format CCYY, default current local year
  650.      * @param string month in format MM, default current local month
  651.      * @param string day in format DD, default current local day
  652.      * @param string format for returned date
  653.      *
  654.      * @access public
  655.      *
  656.      * @return string date in given format
  657.      */
  658.  
  659.     function nextDay($day="",$month="",$year="",$format="%Y%m%d")
  660.     {
  661.         if(empty($year))
  662.             $year = Date_Calc::dateNow("%Y");
  663.         if(empty($month))
  664.             $month = Date_Calc::dateNow("%m");
  665.         if(empty($day))
  666.             $day = Date_Calc::dateNow("%d");
  667.  
  668.         $days = Date_Calc::dateToDays($day,$month,$year);
  669.  
  670.         return(Date_Calc::daysToDate($days + 1,$format));
  671.  
  672.     } // end func nextDay
  673.  
  674.     /**
  675.      * Returns date of day before given date.
  676.      *
  677.      * @param string year in format CCYY, default current local year
  678.      * @param string month in format MM, default current local month
  679.      * @param string day in format DD, default current local day
  680.      * @param string format for returned date
  681.      *
  682.      * @access public
  683.      *
  684.      * @return string date in given format
  685.      */
  686.  
  687.     function prevDay($day="",$month="",$year="",$format="%Y%m%d")
  688.     {
  689.         if(empty($year))
  690.             $year = Date_Calc::dateNow("%Y");
  691.         if(empty($month))
  692.             $month = Date_Calc::dateNow("%m");
  693.         if(empty($day))
  694.             $day = Date_Calc::dateNow("%d");
  695.  
  696.         $days = Date_Calc::dateToDays($day,$month,$year);
  697.  
  698.         return(Date_Calc::daysToDate($days - 1,$format));
  699.  
  700.     } // end func prevDay
  701.  
  702.     /**
  703.      * Sets century for 2 digit year.
  704.      * 51-99 is 19, else 20
  705.      *
  706.      * @param string 2 digit year
  707.      *
  708.      * @access public
  709.      *
  710.      * @return string 4 digit year
  711.      */
  712.  
  713.     function defaultCentury($year)
  714.     {
  715.         if(strlen($year) == 1)
  716.             $year = "0$year";
  717.         if($year > 50)
  718.             return( "19$year" );
  719.         else
  720.             return( "20$year" );
  721.  
  722.     } // end func defaultCentury
  723.  
  724.     /**
  725.      * Returns number of days between two given dates.
  726.      *
  727.      * @param string year in format CCYY
  728.      * @param string month in format MM
  729.      * @param string day in format DD
  730.      * @param string year in format CCYY
  731.      * @param string month in format MM
  732.      * @param string day in format DD
  733.      *
  734.      * @access public
  735.      *
  736.      * @return int absolute number of days between dates,
  737.      *      -1 if there is an error.
  738.      */
  739.  
  740.     function dateDiff($day1,$month1,$year1,$day2,$month2,$year2)
  741.     {
  742.         if(!Date_Calc::isValidDate($day1,$month1,$year1))
  743.             return -1;
  744.         if(!Date_Calc::isValidDate($day2,$month2,$year2))
  745.             return -1;
  746.  
  747.         return(abs((Date_Calc::dateToDays($day1,$month1,$year1))
  748.                     - (Date_Calc::dateToDays($day2,$month2,$year2))));
  749.  
  750.     } // end func dateDiff
  751.  
  752.     /**
  753.     * Compares two dates
  754.     *
  755.     * @param string $day1   day in format DD
  756.     * @param string $month1 month in format MM
  757.     * @param string $year1  year in format CCYY
  758.     * @param string $day2   day in format DD
  759.     * @param string $month2 month in format MM
  760.     * @param string $year2  year in format CCYY
  761.     *
  762.     * @access public
  763.     * @return int 0 on equality, 1 if date 1 is greater, -1 if smaller
  764.     */
  765.     function compareDates($day1,$month1,$year1,$day2,$month2,$year2)
  766.     {
  767.         $ndays1 = Date_Calc::dateToDays($day1, $month1, $year1);
  768.         $ndays2 = Date_Calc::dateToDays($day2, $month2, $year2);
  769.         if ($ndays1 == $ndays2) {
  770.             return 0;
  771.         }
  772.         return ($ndays1 > $ndays2) ? 1 : -1;
  773.     }
  774.  
  775.     /**
  776.      * Find the number of days in the given month.
  777.      *
  778.      * @param string month in format MM, default current local month
  779.      *
  780.      * @access public
  781.      *
  782.      * @return int number of days
  783.      */
  784.  
  785.     function daysInMonth($month="",$year="")
  786.     {
  787.         if(empty($year))
  788.             $year = Date_Calc::dateNow("%Y");
  789.         if(empty($month))
  790.             $month = Date_Calc::dateNow("%m");
  791.  
  792.         if($month == 2)
  793.         {
  794.             if(Date_Calc::isLeapYear($year))
  795.                 return 29;
  796.             else
  797.                 return 28;
  798.         }
  799.         elseif($month == 4 or $month == 6 or $month == 9 or $month == 11)
  800.             return 30;
  801.         else
  802.             return 31;
  803.     } // end func daysInMonth
  804.  
  805.     /**
  806.      * Returns the number of rows on a calendar month. Useful for
  807.      * determining the number of rows when displaying a typical
  808.      * month calendar.
  809.      *
  810.      * @param string month in format MM, default current local month
  811.      * @param string year in format YYCC, default current local year
  812.      *
  813.      * @access public
  814.      *
  815.      * @return int number of weeks
  816.      */
  817.  
  818.     function weeksInMonth($month="",$year="",$fdow=null)
  819.     {
  820.         if(empty($year))
  821.             $year = Date_Calc::dateNow("%Y");
  822.         if(empty($month))
  823.             $month = Date_Calc::dateNow("%m");
  824.         if($fdow === null)
  825.             $fdow = DATE_CALC_BEGIN_WEEKDAY;
  826.  
  827.         if($fdow == 1)
  828.         {
  829.  
  830.             if(Date_Calc::firstOfMonthWeekday($month,$year) == 0)
  831.                 $first_week_days = 1;
  832.             else
  833.                 $first_week_days = 7 - (Date_Calc::firstOfMonthWeekday($month,$year) - 1);
  834.  
  835.         }
  836.         else
  837.             $first_week_days = 7 - Date_Calc::firstOfMonthWeekday($month,$year);
  838.  
  839.         return ceil(((Date_Calc::daysInMonth($month,$year) - $first_week_days) / 7) + 1);
  840.  
  841.     } // end func weeksInMonth
  842.  
  843.     /**
  844.      * Find the day of the week for the first of the month of given date.
  845.      *
  846.      * @param string year in format CCYY, default to current local year
  847.      * @param string month in format MM, default to current local month
  848.      *
  849.      * @access public
  850.      *
  851.      * @return int number of weekday for the first day, 0=Sunday
  852.      */
  853.  
  854.     function firstOfMonthWeekday($month="",$year="")
  855.     {
  856.         if(empty($year))
  857.             $year = Date_Calc::dateNow("%Y");
  858.         if(empty($month))
  859.             $month = Date_Calc::dateNow("%m");
  860.  
  861.         return(Date_Calc::dayOfWeek("01",$month,$year));
  862.  
  863.     } // end func firstOfMonthWeekday
  864.  
  865.     /**
  866.      * Return date of first day of month of given date.
  867.      *
  868.      * @param string year in format CCYY, default current local year
  869.      * @param string month in format MM, default current local month
  870.      * @param string format for returned date
  871.      *
  872.      * @access public
  873.      *
  874.      * @return string date in given format
  875.      */
  876.  
  877.     function beginOfMonth($month="",$year="",$format="%Y%m%d")
  878.     {
  879.         if(empty($year))
  880.             $year = Date_Calc::dateNow("%Y");
  881.         if(empty($month))
  882.             $month = Date_Calc::dateNow("%m");
  883.  
  884.         return(Date_Calc::dateFormat("01",$month,$year,$format));
  885.  
  886.     } // end of func beginOfMonth
  887.  
  888.     /**
  889.      * Find the month day of the beginning of week for given date,
  890.      * using DATE_CALC_BEGIN_WEEKDAY. (can return weekday of prev month.)
  891.      *
  892.      * @param string year in format CCYY, default current local year
  893.      * @param string month in format MM, default current local month
  894.      * @param string day in format DD, default current local day
  895.      * @param string format for returned date
  896.      *
  897.      * @access public
  898.      *
  899.      * @return string date in given format
  900.      */
  901.  
  902.     function beginOfWeek($day="",$month="",$year="",$format="%Y%m%d",$fdow=null)
  903.     {
  904.         if(empty($year))
  905.             $year = Date_Calc::dateNow("%Y");
  906.         if(empty($month))
  907.             $month = Date_Calc::dateNow("%m");
  908.         if(empty($day))
  909.             $day = Date_Calc::dateNow("%d");
  910.         if($fdow === null)
  911.             $fdow = DATE_CALC_BEGIN_WEEKDAY;
  912.  
  913.         $this_weekday = Date_Calc::dayOfWeek($day,$month,$year);
  914.  
  915.         if($fdow == 1)
  916.         {
  917.             if($this_weekday == 0)
  918.                 $beginOfWeek = Date_Calc::dateToDays($day,$month,$year) - 6;
  919.             else
  920.                 $beginOfWeek = Date_Calc::dateToDays($day,$month,$year)
  921.                     - $this_weekday + 1;
  922.         }
  923.         else
  924.                 $beginOfWeek = (Date_Calc::dateToDays($day,$month,$year)
  925.                     - $this_weekday);
  926.  
  927.  
  928.        /*  $beginOfWeek = (Date_Calc::dateToDays($day,$month,$year)
  929.             - ($this_weekday - $fdow)); */
  930.  
  931.         return(Date_Calc::daysToDate($beginOfWeek,$format));
  932.  
  933.     } // end of func beginOfWeek
  934.  
  935.     /**
  936.      * Find the month day of the end of week for given date,
  937.      * using DATE_CALC_BEGIN_WEEKDAY. (can return weekday
  938.      * of following month.)
  939.      *
  940.      * @param string year in format CCYY, default current local year
  941.      * @param string month in format MM, default current local month
  942.      * @param string day in format DD, default current local day
  943.      * @param string format for returned date
  944.      *
  945.      * @access public
  946.      *
  947.      * @return string date in given format
  948.      */
  949.  
  950.     function endOfWeek($day="",$month="",$year="",$format="%Y%m%d",$fdow=null)
  951.     {
  952.         if(empty($year))
  953.             $year = Date_Calc::dateNow("%Y");
  954.         if(empty($month))
  955.             $month = Date_Calc::dateNow("%m");
  956.         if(empty($day))
  957.             $day = Date_Calc::dateNow("%d");
  958.         if($fdow === null)
  959.             $fdow = DATE_CALC_BEGIN_WEEKDAY;
  960.  
  961.         $this_weekday = Date_Calc::dayOfWeek($day,$month,$year);
  962.  
  963.         $last_dayOfWeek = (Date_Calc::dateToDays($day,$month,$year)
  964.             + (6 - $this_weekday + $fdow));
  965.  
  966.         return(Date_Calc::daysToDate($last_dayOfWeek,$format));
  967.  
  968.     } // end func endOfWeek
  969.  
  970.     /**
  971.      * Find the month day of the beginning of week after given date,
  972.      * using DATE_CALC_BEGIN_WEEKDAY. (can return weekday of prev month.)
  973.      *
  974.      * @param string year in format CCYY, default current local year
  975.      * @param string month in format MM, default current local month
  976.      * @param string day in format DD, default current local day
  977.      * @param string format for returned date
  978.      *
  979.      * @access public
  980.      *
  981.      * @return string date in given format
  982.      */
  983.  
  984.     function beginOfNextWeek($day="",$month="",$year="",$format="%Y%m%d",$fdow=null)
  985.     {
  986.         if(empty($year))
  987.             $year = Date_Calc::dateNow("%Y");
  988.         if(empty($month))
  989.             $month = Date_Calc::dateNow("%m");
  990.         if(empty($day))
  991.             $day = Date_Calc::dateNow("%d");
  992.         if($fdow === null)
  993.             $fdow = DATE_CALC_BEGIN_WEEKDAY;
  994.  
  995.         $date = Date_Calc::daysToDate(Date_Calc::dateToDays($day+7,$month,$year),"%Y%m%d");
  996.  
  997.         $next_week_year = substr($date,0,4);
  998.         $next_week_month = substr($date,4,2);
  999.         $next_week_day = substr($date,6,2);
  1000.  
  1001.         $this_weekday = Date_Calc::dayOfWeek($next_week_day,$next_week_month,$next_week_year);
  1002.  
  1003.         $beginOfWeek = (Date_Calc::dateToDays($next_week_day,$next_week_month,$next_week_year)
  1004.             - ($this_weekday - $fdow));
  1005.  
  1006.         return(Date_Calc::daysToDate($beginOfWeek,$format));
  1007.  
  1008.     } // end func beginOfNextWeek
  1009.  
  1010.     /**
  1011.      * Find the month day of the beginning of week before given date,
  1012.      * using DATE_CALC_BEGIN_WEEKDAY. (can return weekday of prev month.)
  1013.      *
  1014.      * @param string year in format CCYY, default current local year
  1015.      * @param string month in format MM, default current local month
  1016.      * @param string day in format DD, default current local day
  1017.      * @param string format for returned date
  1018.      *
  1019.      * @access public
  1020.      *
  1021.      * @return string date in given format
  1022.      */
  1023.  
  1024.     function beginOfPrevWeek($day="",$month="",$year="",$format="%Y%m%d",$fdow=null)
  1025.     {
  1026.         if(empty($year))
  1027.             $year = Date_Calc::dateNow("%Y");
  1028.         if(empty($month))
  1029.             $month = Date_Calc::dateNow("%m");
  1030.         if(empty($day))
  1031.             $day = Date_Calc::dateNow("%d");
  1032.         if($fdow === null)
  1033.             $fdow = DATE_CALC_BEGIN_WEEKDAY;
  1034.  
  1035.         $date = Date_Calc::daysToDate(Date_Calc::dateToDays($day-7,$month,$year),"%Y%m%d");
  1036.  
  1037.         $next_week_year = substr($date,0,4);
  1038.         $next_week_month = substr($date,4,2);
  1039.         $next_week_day = substr($date,6,2);
  1040.  
  1041.         $this_weekday = Date_Calc::dayOfWeek($next_week_day,$next_week_month,$next_week_year);
  1042.  
  1043.         $beginOfWeek = (Date_Calc::dateToDays($next_week_day,$next_week_month,$next_week_year)
  1044.             - ($this_weekday - $fdow));
  1045.  
  1046.         return(Date_Calc::daysToDate($beginOfWeek,$format));
  1047.  
  1048.     } // end func beginOfPrevWeek
  1049.  
  1050.     /**
  1051.      * Return an array with days in week
  1052.      *
  1053.      * @param string year in format CCYY, default current local year
  1054.      * @param string month in format MM, default current local month
  1055.      * @param string day in format DD, default current local day
  1056.      * @param string format for returned date
  1057.      *
  1058.      * @access public
  1059.      *
  1060.      * @return array $week[$weekday]
  1061.      */
  1062.  
  1063.     function getCalendarWeek($day="",$month="",$year="",$format="%Y%m%d",$fdow=null)
  1064.     {
  1065.         if(empty($year))
  1066.             $year = Date_Calc::dateNow("%Y");
  1067.         if(empty($month))
  1068.             $month = Date_Calc::dateNow("%m");
  1069.         if(empty($day))
  1070.             $day = Date_Calc::dateNow("%d");
  1071.         if($fdow === null)
  1072.             $fdow = DATE_CALC_BEGIN_WEEKDAY;
  1073.  
  1074.         $week_array = array();
  1075.  
  1076.         // date for the column of week
  1077.  
  1078.         $curr_day = Date_Calc::beginOfWeek($day,$month,$year,"%E",$fdow);
  1079.  
  1080.             for($counter=0; $counter <= 6; $counter++)
  1081.             {
  1082.                 $week_array[$counter] = utf8_encode(Date_Calc::daysToDate($curr_day,$format));
  1083.                 $curr_day++;
  1084.             }
  1085.  
  1086.         return $week_array;
  1087.  
  1088.     } // end func getCalendarWeek
  1089.  
  1090.     /**
  1091.      * Return a set of arrays to construct a calendar month for
  1092.      * the given date.
  1093.      *
  1094.      * @param string year in format CCYY, default current local year
  1095.      * @param string month in format MM, default current local month
  1096.      * @param string format for returned date
  1097.      *
  1098.      * @access public
  1099.      *
  1100.      * @return array $month[$row][$col]
  1101.      */
  1102.  
  1103.     function getCalendarMonth($month="",$year="",$format="%Y%m%d",$fdow=null)
  1104.     {
  1105.         if(empty($year))
  1106.             $year = Date_Calc::dateNow("%Y");
  1107.         if(empty($month))
  1108.             $month = Date_Calc::dateNow("%m");
  1109.         if($fdow === null)
  1110.             $fdow = DATE_CALC_BEGIN_WEEKDAY;
  1111.  
  1112.         $month_array = array();
  1113.  
  1114.         // date for the first row, first column of calendar month
  1115.         if($fdow == 1)
  1116.         {
  1117.             if(Date_Calc::firstOfMonthWeekday($month,$year) == 0)
  1118.                 $curr_day = Date_Calc::dateToDays("01",$month,$year) - 6;
  1119.             else
  1120.                 $curr_day = Date_Calc::dateToDays("01",$month,$year)
  1121.                     - Date_Calc::firstOfMonthWeekday($month,$year) + 1;
  1122.         }
  1123.         else
  1124.                 $curr_day = (Date_Calc::dateToDays("01",$month,$year)
  1125.                     - Date_Calc::firstOfMonthWeekday($month,$year));
  1126.  
  1127.         // number of days in this month
  1128.         $daysInMonth = Date_Calc::daysInMonth($month,$year);
  1129.  
  1130.         $weeksInMonth = Date_Calc::weeksInMonth($month,$year,$fdow);
  1131.         for($row_counter=0; $row_counter < $weeksInMonth; $row_counter++)
  1132.         {
  1133.             for($column_counter=0; $column_counter <= 6; $column_counter++)
  1134.             {
  1135.                 $month_array[$row_counter][$column_counter] = Date_Calc::daysToDate($curr_day,$format);
  1136.                 $curr_day++;
  1137.             }
  1138.         }
  1139.  
  1140.         return $month_array;
  1141.  
  1142.     } // end func getCalendarMonth
  1143.  
  1144.     /**
  1145.      * Return a set of arrays to construct a calendar year for
  1146.      * the given date.
  1147.      *
  1148.      * @param string year in format CCYY, default current local year
  1149.      * @param string format for returned date
  1150.      *
  1151.      * @access public
  1152.      *
  1153.      * @return array $year[$month][$row][$col]
  1154.      */
  1155.  
  1156.     function getCalendarYear($year="",$format="%Y%m%d")
  1157.     {
  1158.         if(empty($year))
  1159.             $year = Date_Calc::dateNow("%Y");
  1160.  
  1161.         $year_array = array();
  1162.  
  1163.         for($curr_month=0; $curr_month <=11; $curr_month++)
  1164.             $year_array[$curr_month] = Date_Calc::getCalendarMonth(sprintf("%02d",$curr_month+1),$year,$format);
  1165.  
  1166.         return $year_array;
  1167.  
  1168.     } // end func getCalendarYear
  1169.  
  1170.     /**
  1171.      * Converts a date to number of days since a
  1172.      * distant unspecified epoch.
  1173.      *
  1174.      * @param string year in format CCYY
  1175.      * @param string month in format MM
  1176.      * @param string day in format DD
  1177.      *
  1178.      * @access public
  1179.      *
  1180.      * @return integer number of days
  1181.      */
  1182.  
  1183.     function dateToDays($day,$month,$year)
  1184.     {
  1185.  
  1186.         $century = substr($year,0,2);
  1187.         $year = substr($year,2,2);
  1188.  
  1189.         if($month > 2)
  1190.             $month -= 3;
  1191.         else
  1192.         {
  1193.             $month += 9;
  1194.             if($year)
  1195.                 $year--;
  1196.             else
  1197.             {
  1198.                 $year = 99;
  1199.                 $century --;
  1200.             }
  1201.         }
  1202.  
  1203.         return ( floor((  146097 * $century)    /  4 ) +
  1204.                 floor(( 1461 * $year)        /  4 ) +
  1205.                 floor(( 153 * $month +  2) /  5 ) +
  1206.                     $day +  1721119);
  1207.     } // end func dateToDays
  1208.  
  1209.     /**
  1210.      * Converts number of days to a distant unspecified epoch.
  1211.      *
  1212.      * @param int number of days
  1213.      * @param string format for returned date
  1214.      *
  1215.      * @access public
  1216.      *
  1217.      * @return string date in specified format
  1218.      */
  1219.  
  1220.     function daysToDate($days,$format="%Y%m%d")
  1221.     {
  1222.  
  1223.         $days     -=   1721119;
  1224.         $century  =    floor(( 4 * $days -  1) /  146097);
  1225.         $days     =    floor(4 * $days - 1 - 146097 * $century);
  1226.         $day      =    floor($days /  4);
  1227.  
  1228.         $year     =    floor(( 4 * $day +  3) /  1461);
  1229.         $day      =    floor(4 * $day +  3 -  1461 * $year);
  1230.         $day      =    floor(($day +  4) /  4);
  1231.  
  1232.         $month    =    floor(( 5 * $day -  3) /  153);
  1233.         $day      =    floor(5 * $day -  3 -  153 * $month);
  1234.         $day      =    floor(($day +  5) /  5);
  1235.  
  1236.         if($month < 10)
  1237.             $month +=3;
  1238.         else
  1239.         {
  1240.             $month -=9;
  1241.             if($year++ == 99)
  1242.             {
  1243.                 $year = 0;
  1244.                 $century++;
  1245.             }
  1246.         }
  1247.  
  1248.         $century = sprintf("%02d",$century);
  1249.         $year = sprintf("%02d",$year);
  1250.         return(Date_Calc::dateFormat($day,$month,$century.$year,$format));
  1251.  
  1252.     } // end func daysToDate
  1253.  
  1254.     /**
  1255.      * Calculates the date of the Nth weekday of the month,
  1256.      * such as the second Saturday of January 2000.
  1257.      *
  1258.      * @param string occurance: 1=first, 2=second, 3=third, etc.
  1259.      * @param string dayOfWeek: 0=Sunday, 1=Monday, etc.
  1260.      * @param string year in format CCYY
  1261.      * @param string month in format MM
  1262.      * @param string format for returned date
  1263.      *
  1264.      * @access public
  1265.      *
  1266.      * @return string date in given format
  1267.      */
  1268.  
  1269.     function NWeekdayOfMonth($occurance,$dayOfWeek,$month,$year,$format="%Y%m%d")
  1270.     {
  1271.         $year = sprintf("%04d",$year);
  1272.         $month = sprintf("%02d",$month);
  1273.  
  1274.         $DOW1day = sprintf("%02d",(($occurance - 1) * 7 + 1));
  1275.         $DOW1 = Date_Calc::dayOfWeek($DOW1day,$month,$year);
  1276.  
  1277.         $wdate = ($occurance - 1) * 7 + 1 +
  1278.                 (7 + $dayOfWeek - $DOW1) % 7;
  1279.  
  1280.         if( $wdate > Date_Calc::daysInMonth($month,$year)) {
  1281.             return -1;
  1282.         } else {
  1283.             return(Date_Calc::dateFormat($wdate,$month,$year,$format));
  1284.         }
  1285.  
  1286.     } // end func NWeekdayOfMonth
  1287.  
  1288.     /**
  1289.      *  Formats the date in the given format, much like
  1290.      *  strfmt(). This function is used to alleviate the
  1291.      *  problem with 32-bit numbers for dates pre 1970
  1292.      *  or post 2038, as strfmt() has on most systems.
  1293.      *  Most of the formatting options are compatible.
  1294.      *
  1295.      *  formatting options:
  1296.      *
  1297.      *  %a        abbreviated weekday name (Sun, Mon, Tue)
  1298.      *  %A        full weekday name (Sunday, Monday, Tuesday)
  1299.      *  %b        abbreviated month name (Jan, Feb, Mar)
  1300.      *  %B        full month name (January, February, March)
  1301.      *  %d        day of month (range 00 to 31)
  1302.      *  %e        day of month, single digit (range 0 to 31)
  1303.      *  %E        number of days since unspecified epoch (integer)
  1304.      *             (%E is useful for passing a date in a URL as
  1305.      *             an integer value. Then simply use
  1306.      *             daysToDate() to convert back to a date.)
  1307.      *  %j        day of year (range 001 to 366)
  1308.      *  %m        month as decimal number (range 1 to 12)
  1309.      *  %n        newline character (\n)
  1310.      *  %t        tab character (\t)
  1311.      *  %w        weekday as decimal (0 = Sunday)
  1312.      *  %U        week number of current year, first sunday as first week
  1313.      *  %y        year as decimal (range 00 to 99)
  1314.      *  %Y        year as decimal including century (range 0000 to 9999)
  1315.      *  %%        literal '%'
  1316.      *
  1317.      * @param string year in format CCYY
  1318.      * @param string month in format MM
  1319.      * @param string day in format DD
  1320.      * @param string format for returned date
  1321.      *
  1322.      * @access public
  1323.      *
  1324.      * @return string date in given format
  1325.      */
  1326.  
  1327.     function dateFormat($day,$month,$year,$format)
  1328.     {
  1329.         if(!Date_Calc::isValidDate($day,$month,$year))
  1330.         {
  1331.             $year = Date_Calc::dateNow("%Y");
  1332.             $month = Date_Calc::dateNow("%m");
  1333.             $day = Date_Calc::dateNow("%d");
  1334.         }
  1335.  
  1336.         $output = "";
  1337.  
  1338.         for($strpos = 0; $strpos < strlen($format); $strpos++)
  1339.         {
  1340.             $char = substr($format,$strpos,1);
  1341.             if($char == "%")
  1342.             {
  1343.                 $nextchar = substr($format,$strpos + 1,1);
  1344.                 switch($nextchar)
  1345.                 {
  1346.                     case "a":
  1347.                         $output .= Date_Calc::getWeekdayAbbrname($day,$month,$year);
  1348.                         break;
  1349.                     case "A":
  1350.                         $output .= Date_Calc::getWeekdayFullname($day,$month,$year);
  1351.                         break;
  1352.                     case "b":
  1353.                         $output .= Date_Calc::getMonthAbbrname($month);
  1354.                         break;
  1355.                     case "B":
  1356.                         $output .= Date_Calc::getMonthFullname($month);
  1357.                         break;
  1358.                     case "d":
  1359.                         $output .= sprintf("%02d",$day);
  1360.                         break;
  1361.                     case "e":
  1362.                         $output .= $day;
  1363.                         break;
  1364.                     case "E":
  1365.                         $output .= Date_Calc::dateToDays($day,$month,$year);
  1366.                         break;
  1367.                     case "j":
  1368.                         $output .= Date_Calc::julianDate($day,$month,$year);
  1369.                         break;
  1370.                     case "m":
  1371.                         $output .= sprintf("%02d",$month);
  1372.                         break;
  1373.                     case "n":
  1374.                         $output .= "\n";
  1375.                         break;
  1376.                     case "t":
  1377.                         $output .= "\t";
  1378.                         break;
  1379.                     case "w":
  1380.                         $output .= Date_Calc::dayOfWeek($day,$month,$year);
  1381.                         break;
  1382.                     case "U":
  1383.                         $output .= Date_Calc::weekOfYear($day,$month,$year);
  1384.                         break;
  1385.                     case "y":
  1386.                         $output .= substr($year,2,2);
  1387.                         break;
  1388.                     case "Y":
  1389.                         $output .= $year;
  1390.                         break;
  1391.                     case "%":
  1392.                         $output .= "%";
  1393.                         break;
  1394.                     default:
  1395.                         $output .= $char.$nextchar;
  1396.                 }
  1397.                 $strpos++;
  1398.             }
  1399.             else
  1400.             {
  1401.                 $output .= $char;
  1402.             }
  1403.         }
  1404.         return $output;
  1405.  
  1406.     } // end func dateFormat
  1407.  
  1408.     /**
  1409.      * Returns the current local year in format CCYY
  1410.      *
  1411.      * @access public
  1412.      *
  1413.      * @return string year in format CCYY
  1414.      */
  1415.  
  1416.     function getYear()
  1417.     {
  1418.         return Date_Calc::dateNow("%Y");
  1419.  
  1420.     } // end func getYear
  1421.  
  1422.     /**
  1423.      * Returns the current local month in format MM
  1424.      *
  1425.      * @access public
  1426.      *
  1427.      * @return string month in format MM
  1428.      */
  1429.  
  1430.     function getMonth()
  1431.     {
  1432.         return Date_Calc::dateNow("%m");
  1433.  
  1434.     } // end func getMonth
  1435.  
  1436.     /**
  1437.      * Returns the current local day in format DD
  1438.      *
  1439.      * @access public
  1440.      *
  1441.      * @return string day in format DD
  1442.      */
  1443.  
  1444.     function getDay()
  1445.     {
  1446.         return Date_Calc::dateNow("%d");
  1447.  
  1448.     } // end func getDay
  1449.  
  1450.     /**
  1451.      * Returns the full month name for the given month
  1452.      *
  1453.      * @param string month in format MM
  1454.      *
  1455.      * @access public
  1456.      *
  1457.      * @return string full month name
  1458.      */
  1459.  
  1460.     function getMonthFullname($month)
  1461.     {
  1462.         $month = (int)$month;
  1463.  
  1464.         if(empty($month))
  1465.             $month = (int) Date_Calc::dateNow("%m");
  1466.  
  1467.         $month_names = Date_Calc::getMonthNames();
  1468.         return $month_names[$month];
  1469.         // getMonthNames returns months with correct indexes
  1470.         //return $month_names[($month - 1)];
  1471.  
  1472.     } // end func getMonthFullname
  1473.  
  1474.     /**
  1475.      * Returns the abbreviated month name for the given month
  1476.      *
  1477.      * @param string month in format MM
  1478.      * @param int optional length of abbreviation, default is 3
  1479.      *
  1480.      * @access public
  1481.      *
  1482.      * @return string abbreviated month name
  1483.      * @see Date_Calc::getMonthFullname
  1484.      */
  1485.  
  1486.     function getMonthAbbrname($month,$length=3)
  1487.     {
  1488.         $month = (int)$month;
  1489.  
  1490.         if(empty($month))
  1491.             $month = Date_Calc::dateNow("%m");
  1492.         return substr(Date_Calc::getMonthFullname($month), 0, $length);
  1493.     } // end func getMonthAbbrname
  1494.  
  1495.     /**
  1496.      * Returns the full weekday name for the given date
  1497.      *
  1498.      * @param string year in format CCYY, default current local year
  1499.      * @param string month in format MM, default current local month
  1500.      * @param string day in format DD, default current local day
  1501.      *
  1502.      * @access public
  1503.      *
  1504.      * @return string full month name
  1505.      */
  1506.  
  1507.     function getWeekdayFullname($day="",$month="",$year="")
  1508.     {
  1509.         if(empty($year))
  1510.             $year = Date_Calc::dateNow("%Y");
  1511.         if(empty($month))
  1512.             $month = Date_Calc::dateNow("%m");
  1513.         if(empty($day))
  1514.             $day = Date_Calc::dateNow("%d");
  1515.  
  1516.         $weekday_names = Date_Calc::getWeekDays();
  1517.         $weekday = Date_Calc::dayOfWeek($day,$month,$year);
  1518.  
  1519.         return $weekday_names[$weekday];
  1520.  
  1521.     } // end func getWeekdayFullname
  1522.  
  1523.     /**
  1524.      * Returns the abbreviated weekday name for the given date
  1525.      *
  1526.      * @param string year in format CCYY, default current local year
  1527.      * @param string month in format MM, default current local month
  1528.      * @param string day in format DD, default current local day
  1529.      * @param int optional length of abbreviation, default is 3
  1530.      *
  1531.      * @access public
  1532.      *
  1533.      * @return string full month name
  1534.      * @see Date_Calc::getWeekdayFullname
  1535.      */
  1536.  
  1537.     function getWeekdayAbbrname($day="",$month="",$year="",$length=3)
  1538.     {
  1539.         if(empty($year))
  1540.             $year = Date_Calc::dateNow("%Y");
  1541.         if(empty($month))
  1542.             $month = Date_Calc::dateNow("%m");
  1543.         if(empty($day))
  1544.             $day = Date_Calc::dateNow("%d");
  1545.         return substr(Date_Calc::getWeekdayFullname($day,$month,$year),0,$length);
  1546.     } // end func getWeekdayFullname
  1547.  
  1548.     /**
  1549.     * Returns the numeric month from the month name or an abreviation
  1550.     *
  1551.     * Both August and Aug would return 8.
  1552.     * Month name is case insensitive.
  1553.     *
  1554.     * @param    string  month name
  1555.     * @return   integer month number
  1556.     */
  1557.     function getMonthFromFullName($month)
  1558.     {
  1559.         $month = strtolower($month);
  1560.         $months = Date_Calc::getMonthNames();
  1561.         while(list($id, $name) = each($months)){
  1562.             if(ereg($month, strtolower($name))){
  1563.                 return($id);
  1564.             }
  1565.         }
  1566.         return(0);
  1567.     }
  1568.  
  1569.     /**
  1570.     * Retunrs an array of month names
  1571.     *
  1572.     * Used to take advantage of the setlocale function to return
  1573.     * language specific month names.
  1574.     * XXX cache values to some global array to avoid preformace hits when called more than once.
  1575.     *
  1576.     * @returns array An array of month names
  1577.     */
  1578.     function getMonthNames()
  1579.     {
  1580.         for($i=1;$i<13;$i++){
  1581.             $months[$i] = strftime('%B', mktime(0, 0, 0, $i, 1, 2001));
  1582.         }
  1583.         return($months);
  1584.     }
  1585.  
  1586.     /**
  1587.     * Returns an array of week days
  1588.     *
  1589.     * Used to take advantage of the setlocale function to
  1590.     * return language specific week days
  1591.     * XXX cache values to some global array to avoid preformace hits when called more than once.
  1592.     *
  1593.     * @returns array An array of week day names
  1594.     */
  1595.     function getWeekDays()
  1596.     {
  1597.         for($i=0;$i<7;$i++){
  1598.             $weekdays[$i] = strftime('%A', mktime(0, 0, 0, 1, $i, 2001));
  1599.         }
  1600.         return($weekdays);
  1601.     }
  1602.  
  1603. } // end class Date_calendar
  1604.  
  1605. ?>