#native_company# #native_desc#
#native_cta#

Date class

By Edwin Villapando
on December 29, 2001

Version: 0.1-beta

Type: Class

Category: Calendars/Dates

License: GNU General Public License

Description: This first version of the Date class is for evaluation. It performs date arithmetic such as difference between two dates, adding days/hours/week/minutes/seconds, etc…

This class needs enhancements for it cannot compute before 1970.

************CUT AND PASTE CODE AFTER THIS LINE TO dateclass_sample.php*********
<?php //---dateclass_sample.php

    //---Description:   Sample call to Date class
    //---Author:        Edwin C. Villapando  ([email protected])
    //---Version:       0.1-beta
    //---Date:          2001-12-29 22:30
    //---File:          dateclass_sample.php

    include ("Date.class");

    //---Instances of the Date class

    $dateSTR = new Date("2001-12-01");  //---passed with String date
    $date = new Date($dateSTR);         //---passed with Date object
    $dateINT = new Date(time());        //---passed with timestamp/integer
    $dateNULL = new Date();             //---no parameter, default is current time

    //---variants
    $dateTIMEONLY = new Date("21:45");              //---passed with time only
    $dateDATETIME = new Date("2001-12-29 22:30");   //---passed with date and time


    $leapyear = new Date("2000-01-01");
    $lastday = $date->lastdayofmonth();
    $firstday = $date->firstdayofmonth();


    echo "$date->CDATE is leapyear? = " . ($date->isleapyear() ? "Yes" : "No") . "n";
    echo "$leapyear->CDATE is leapyear? = " . ($leapyear->isleapyear() ? "Yes" : "No") . "n";

    $nextday = $date->dateadd(2);
    echo "2 day after $date->CDATE is $nextday->CDATEn";

    echo "Days difference on lastday of $date->CDATE is " . $date->datediff($date->lastdayofmonth()) . " day(s)n";

    echo "First day of $date->CDATE is $firstday->CDATEn";
    echo "Last day of $date->CDATE is $lastday->CDATEn";


    echo "Days difference between $date->CDATE and " .
         "$lastday->CDATE is " . $date->datediff($lastday) . " day(s) n";

    $date->setdate($lastday);
    echo "nSet date to new value = $date->CDATEn";


    $firstday->setdate($firstday->firstdayofyear());
    $lastday->setdate($lastday->lastdayofyear());

    echo "First date is $firstday->CDATEn";
    echo "Last date is $lastday->CDATEn";

    echo "nSample Time:nt$dateTIMEONLY = new Date("21:45");t$dateTIMEONLY->CTIMEn";
    echo "t$dateDATETIME = new Date("2001-12-29 22:30");t$dateDATETIME->CTIMEn";

    echo "nSome formatting:n";
    echo "t$dateTIMEONLY = new Date("21:45");t" . $dateTIMEONLY->format("%I:%M:%S %p") . "n";
    echo "t$dateDATETIME = new Date("2001-12-29 22:30");t" . $dateDATETIME->format("%I:%M:%S %p") . "n";

?>
************END OF dateclass_sample.php DO NOT INCLUDE THIS LINE*********


************CUT AND PASTE CODE AFTER THIS LINE TO Date.class*********
<?php //---Date.class

    //---Description:   Date Class
    //---Author:        Edwin C. Villapando  ([email protected])
    //---Version:       0.1-beta
    //---Date:          2001-12-29 22:30
    //---File:          Date.class


    class Date {

        //---
        //---Date class variables
        //---

        var $date;          //---holds the actual date/time stamp
        var $SECONDS;       //---"seconds"
        var $MINUTES;       //---"minutes"
        var $HOURS;         //---"hours"
        var $DAY;           //---"mday"
        var $WEEKDAY;       //---"wday"
        var $CWEEKDAY;      //---"weekday"
        var $MONTH;         //---"mon"
        var $YEAR;          //---"year"
        var $DAYOFYEAR;     //---"yday"
        var $CMONTH;        //---"month"

        var $CDATE;         //---date rep. of $date "1970-01-01"
        var $CTIME;         //---time rep. of $date "11:30:45"

        //---end of Date class variables

        //---
        //---Date class methods
        //---
        
        function Date($date = NULL) {
        //--- Date class constructor

            //---populate the properties with values
            $this->init_date(getdate($this->eval_dparm($date)));
            
        } //---end of Date class constructor


        function eval_dparm($date) {
        //---Evaluate a date parameter and return a date/time stamp

            if (is_string($date)) {
                if (($date == "") || strtotime($date) == -1) {
                    //---String Date is passed but evaluates to non-date/time.
                    $tmpdate = time();
                } else {
                    //---Convert string date to date/time stamp
                    $tmpdate = strtotime($date);
                }

            } elseif (is_null($date))  {
                //---default to current date
                $tmpdate = time();

            } elseif (is_numeric($date)) {
                //---numeric date is passed
                $tmpdate = $date;

            } else {
                if (get_class($date) == "date") {
                    //---The passed parameter is a Date class
                    //---so, get the $obj->date property
                    $tmpdate = $date->date;
                } else {
                    //---Catch anything else, return current date
                    $tmpdate = time();
                }
            }

            return $tmpdate;

        } //---end of eval_dparm

        
        function init_date($date_arr) {
        //---Initialize the properties

            $this->date         = $date_arr[0];
            $this->SECONDS      = $date_arr["seconds"];
            $this->MINUTES      = $date_arr["minutes"];
            $this->HOURS        = $date_arr["hours"];
            $this->DAY          = $date_arr["mday"];
            $this->WEEKDAY      = $date_arr["wday"];
            $this->CWEEKDAY     = $date_arr["weekday"];
            $this->MONTH        = $date_arr["mon"];
            $this->YEAR         = $date_arr["year"];
            $this->DAYOFYEAR    = $date_arr["yday"];
            $this->CMONTH       = $date_arr["month"];

            $this->CDATE        = $this->format("%Y-%m-%d");
            $this->CTIME        = $this->format("%H:%M:%S");

        } //---end of init_date()


        function isleapyear() {
        //----Determine if the current Date object is a leap year

            return (($this->YEAR % 4) == 0);

        } //---end of isleapyear()


        function setdate($date = NULL) {
        //---Change the current date value of the Date object with new one
        //---without destroying the current Date object. Useful on loops

            $this->init_date(getdate($this->eval_dparm($date)));

        } //---end of setdate()


        function format($format = "%Y-%m-%d %H:%M:%S") {
        //---String format the Date object
        //---Use strftime() format mask

            //---default return value format "1970-01-01 11:30:45"
            return strftime($format, $this->date);

        } //---end of format()


        
        function datediff($date, $elaps = "d") {
        //---
        //---Returns number of weeks/days/hours/minutes/seconds
        //---between two dates/time. Default is "d" days to return
        //---
        //---Legend ($elaps):
        //---
        //---   w - weeks
        //---   d - days
        //---   h - hours
        //---   m - minutes
        //---   s - seconds
        //---

            $__DAYS_PER_WEEK__       = (7);
            $__HOURS_IN_A_DAY__      = (24);
            $__MINUTES_IN_A_DAY__    = (1440);
            $__SECONDS_IN_A_DAY__    = (86400);

            
            //---Compute days elaps. This is the default return value
            $__DAYSELAPS = ($this->eval_dparm($date) - $this->date) / $__SECONDS_IN_A_DAY__ ;

            switch ($elaps) {
                case "w":
                    //---Convert it to weeks
                    $__DAYSELAPS =  $__DAYSELAPS / $__DAYS_PER_WEEK__;
                    break;

                case "h":
                    //---Convert it to hours
                    $__DAYSELAPS =  $__DAYSELAPS * $__HOURS_IN_A_DAY__;
                    break;        

                case "m":
                    //---Convert it to minutes
                    $__DAYSELAPS =  $__DAYSELAPS * $__MINUTES_IN_A_DAY__;  
                    break;

                case "s":
                    //---Convert it to seconds
                    $__DAYSELAPS =  $__DAYSELAPS * $__SECONDS_IN_A_DAY__;
                    break;        
            } 

            return $__DAYSELAPS;

        } //---end of datediff()


        function firstdayofmonth() {
        //---Returns a Date object representating the first day of the
        //---month of the current Date object
        //---

            return (new Date(strftime("%Y-%m-%d", mktime(0, 0, 0,
                                   $this->MONTH,           
                                   1,              //---1 always the 1st day 
                                   $this->YEAR))));           
                                                   
        } //---end of firstdayofmonth()

        function firstdayofyear() {
        //---Returns a Date object representating the first day of the
        //---year of the current Date object
        //---

            return (new Date(strftime("%Y-%m-%d", mktime(0, 0, 0,
                                   1,              //---1 always the 1st month
                                   1,              //---1 always the 1st day 
                                   $this->YEAR))));           
                                                   
        } //---end of firstdayofyear()


        function lastdayofmonth() {
        //---Returns a Date object representating the last day of the
        //---month of the current Date object
        //---
    
            return (new Date(strftime("%Y-%m-%d", mktime(0, 0, 0,
                                   $this->MONTH + 1,    //---next month
                                   0,                   //---1-1=0 is the last day of the
                                   $this->YEAR))));     //---current month

        }  //---end of lastdayofmonth()


        function lastdayofyear() {
        //---Returns a Date object representating the last day of the
        //---year of the current Date object
        //---
    
            return (new Date(strftime("%Y-%m-%d", mktime(0, 0, 0,
                                   1,                   //---January
                                   0,                   //---1-1=0 is the last day 
                                   $this->YEAR + 1)))); //---next year

        }  //---end of lastdayofyear()



        function dateadd($number = 0, $interval = "d") {
        //---Returns Date object upon adding $interval/$number to
        //---current Date object. $number is the number to add
        //---
        //---Legend ($interval):
        //---
        //---   yyyy - year
        //---   q    - quarter
        //---   m    - month
        //---   y    - day of year
        //---   d    - day (default with $number = 0)
        //---   w    - weekday
        //---   ww   - week of year
        //---   h    - hour
        //---   n    - minute
        //---   s    - second
        //---    

    
            $hours =  $this->HOURS;
            $minutes =  $this->MINUTES;
            $seconds =  $this->SECONDS;
            $month =  $this->MONTH;
            $day =  $this->DAY;
            $year =  $this->YEAR;

            switch ($interval)
            {
                case "yyyy":
                    //---Add $number to year
                    $year += $number;
                    break;

                case "q":
                    //---Add $number to quarter
                    $year += ($number*3);
                    break;

                case "m":
                    //---Add $number to month
                    $month += $number;
                    break;

                case "y":
                case "d":
                case "w":
                    //---Add $number to day of year, day, day of week
                    $day += $number;
                    break;

                case "ww":
                    //---Add $number to week
                    $day += ($number*7);
                    break;

                case "h":
                    //---Add $number to hours
                    $hours += $number;
                    break;

                case "n":
                    //---Add $number to minutes
                    $minutes += $number;
                    break;

                case "s":
                    //---Add $number to seconds
                    $seconds += $number;
                    break;        
            } 
   
            return (new Date(mktime($hours,
                                    $minutes,
                                    $seconds,
                                    $month,
                                    $day,
                                    $year)));

        } //---end of dateadd()

        //---end of Date class methods

    } //---end of Date class

?> 
************END OF Date.class DO NOT INCLUDE THIS LINE*********