PHP Classes
Icontem

File: Timespan.class.php


  Search   All class groups All class groups   Latest entries Latest entries   Top 10 charts Top 10 charts   Newsletter Newsletter   Blog Blog   Forums Forums   Help FAQ Help FAQ  
  Login   Register  
Recommend this page to a friend! ReTweet ReTweet Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Cybot  >  phpDateTime  >  Timespan.class.php  
File: Timespan.class.php
Role: Class source
Content type: text/plain
Description: class Timespan
Class: phpDateTime
Manipulating dates, times, time intervals
 

Contents

Class file image Download
<?php
/**
 * contains class Timespan
 *
 * @copyright Copyright (C) 2003-2005  Sebastian Mendel <info at sebastianmendel dot de>
 *
 * @license http://www.opensource.org/licenses/lgpl-license.php
 *          GNU Lesser General Public License  - LGPL
 *
 * @package phpDateTime
 * @author Sebastian Mendel <info at sebastianmendel dot de>
 * @version $Id: Timespan.class.php,v 1.14 2005/03/08 16:20:01 cybot_tm Exp $
 * @source $Source: /cvsroot/phpdatetime/phpDateTime/Timespan.class.php,v $
 *
 * @uses DateTime.class.php
 */

/**
 * required class-files
 */
require_once 'DateTime.class.php';

/**
 * Class Timespan
 *
 * @copyright Copyright (C) 2003, 2004  Sebastian Mendel <info at sebastianmendel dot de>
 *
 * @license http://www.opensource.org/licenses/lgpl-license.php
 *          GNU Lesser General Public License  - LGPL
 *
 * @package phpDateTime
 * @author Sebastian Mendel <info@sebastianmendel.de>
 * @uses DateTime
 * @todo finish class
 */
class Timespan
{
    /**
     * start time
     * @access protected
     * @var object DateTime
     */
    var $start;

    /**
     * end time
     * @access protected
     * @var object DateTime
     */
    var $end;

    /** 
     * @var integer fullyears */
    var $fullremyears   = 0;

    /** 
     * @var integer full months */
    var $fullremmonths  = 0;

    /** 
     * @var integer fulldays */
    var $fullremdays    = 0;

    /** 
     * @var integer years */
    var $years  = 0;

    /** 
     * @var integer months */
    var $months = 0;

    /** 
     * @var integer days */
    var $days   = 0;
        
    /** 
     * @var integer fullyears */
    var $fullremhours   = 0;

    /** 
     * @var integer full months */
    var $fullremminutes  = 0;

    /** 
     * @var integer fulldays */
    var $fullremseconds    = 0;

    /** 
     * @var integer years */
    var $hours  = 0;

    /** 
     * @var integer months */
    var $minutes = 0;

    /** 
     * @var integer days */
    var $seconds   = 0;
    
    /**
     * @uses Timespan::set()
     * @access protected
     * @param string|integer|object_DateTime $start
     * @param string|integer|object_DateTime $end
     */
    function Timespan( $start = 0, $end = NULL )
    {
        $this->set( $start, $end );
    }

    /**
     * sets start and end-time
     *
     * @uses Timespan::setStart()
     * @uses Timespan::setEnd()
     * @uses Date::setToStartOfWeek()
     * @uses Date::setToEndOfWeek()
     * @param string|integer|object_DateTime $start
     * @param string|integer|object_DateTime $end
     * @todo finish
     */
    function set( $start = 0, $end = NULL )
    {
        $this->setStart( $start );
        
        if ( NULL === $end )
        {
            $this->setEnd( $start );
        }
        else
        {
            switch ( $end )
            {
            	case 'year': 
                    // add one year to end
            		break;
            	case 'month':
            		// add one month
            		break;
            	case 'week': 
                    // add one year to end
            		break;
            	case 'day': 
                    // add one year to end
            		break;
            	case 'calendarweek': 
                    // set start and end date to start and end of week for current date
                    $this->start->date->setToStartOfWeek();
                    $this->setEnd( $start );
                    $this->end->date->setToEndOfWeek();
            		break;
            	default:
                    $this->setEnd( $end );
            } // switch
        }
        
        //$this->updatePorperties();
    }
    
    /**
     * sets start-date
     *
     * @uses Timespan::start to set it
     * @uses DateTime
     * @uses DateTime::get()
     * @param string|integer|object_DateTime $datetime
     * @return string datetime
     */
    function setStart( $datetime )
    {
        $this->start = new DateTime( $datetime );
        $this->updatePorperties();
        return $this->start->get();
    }
    
    /**
     * stes end-date
     *
     * @uses Timespan::end to set it
     * @uses DateTime
     * @uses DateTime::get()
     * @param string|integer|object_DateTime $datetime
     * @return string datetime
     */
    function setEnd( $datetime )
    {
        $this->end = new DateTime( $datetime );
        $this->updatePorperties();
        return $this->end->get();
    }
    
    /**
     *
     * @uses Timespan::getDifference()
     * @return integer
     */
    function getYearsRemainder()
    {
        return $this->fullremyears;
    }

    /**
     *
     * @uses Timespan::getDifference()
     * @return integer
     */
    function getMonthsRemainder()
    {
        return $this->fullremmonths;
    }

    /**
     *
     * @uses Timespan::getDifference()
     * @return integer
     */
    function getDaysRemainder()
    {
        return $this->fullremdays;
    }

    /**
     * returns array with difference between the two dates
     *
     * differenz = array(
     *   fullremyears,
     *   fullremmonths,
     *   fullremdays,
     *   years,
     *   months,
     *   days, )
     *
     * @access public
     * @return array differences
     *
     */
    function getDifference()
    {
        return array(
            'fullremyears'  => $this->fullremyears,
            'fullremmonths' => $this->fullremmonths,
            'fullremdays'   => $this->fullremdays,
            'fullremhours'  => $this->fullremhours,
            'fullremminutes' => $this->fullremminutes,
            'fullremseconds' => $this->fullremseconds,
            'years'         => $this->years,
            'months'        => $this->months,
            'days'          => $this->days,
            'hours'         => $this->hours,
            'minutes'       => $this->minutes,
            'seconds'       => $this->seconds,
        );
    }
    
    /**
     * sets all properties back to 0
     */
    function resetProperties()
    {
        $this->fullremyears   = 0;
        $this->fullremmonths  = 0;
        $this->fullremdays    = 0;
        $this->fullremhours   = 0;
        $this->fullremminutes = 0;
        $this->fullremseconds = 0;
        $this->years          = 0;
        $this->months         = 0;
        $this->days           = 0;
        $this->hours          = 0;
        $this->minutes        = 0;
        $this->seconds        = 0;
    }
    
    /**
     * updates calculated values like days, months, years, ...
     */
    function updatePorperties()
    {
        $this->resetProperties();
        
        if ( ! is_a( $this->end, 'DateTime' ) || ! is_a( $this->start, 'DateTime' ) )
        {
            return;
        }
        
        if ( $this->end->getAsTs() === $this->start->getAsTs() )
        {
            return;
        }
        elseif ( $this->end->getAsTs() < $this->start->getAsTs() )
        {
            $positive = false;
        }
        else
        {
            $positive = true;
        }
        
        
        // Time
        $this->fullremseconds = $this->end->time->getSeconds() - $this->start->time->getSeconds();
        if ( $this->fullremseconds < 0 )
        {
            if ( $positive )
            {
                $this->fullremminutes--;
                $this->fullremseconds += 60;
            }
            else
            {
                $this->fullremminutes++;
                $this->fullremseconds -= 60;
            }
        }
        
        $this->fullremminutes += $this->end->time->getMinutes() - $this->start->time->getMinutes();
        if ( $this->fullremminutes < 0 )
        {
            if ( $positive )
            {
                $this->fullremhours--;
                $this->fullremminutes += 60;
            }
            else
            {
                $this->fullremhours++;
                $this->fullremminutes -= 60;
            }
        }
        
        $this->fullremhours += $this->end->time->getHours() - $this->start->time->getHours();
        if ( $this->fullremhours < 0 )
        {
            if ( $positive )
            {
                $this->fullremdays--;
                $this->fullremhours += 24;
            }
            else
            {
                $this->fullremdays++;
                $this->fullremhours -= 24;
            }
        }
        
        // Date
        $this->fullremdays += $this->end->date->getDay() - $this->start->date->getDay();
        if ( $this->fullremdays < 0 )
        {
            if ( $positive )
            {
                $this->fullremmonths--;
                $this->fullremdays = $this->start->date->getDaysInMonth() - $this->start->date->getDay();
                $this->fullremdays += $this->end->date->getDay();
            }
            else
            {
                $this->fullremmonths++;
                $this->fullremdays = $this->start->date->getDaysInMonth() - $this->start->date->getDay();
                $this->fullremdays -= $this->end->date->getDay();
            }
        }

        $this->fullremmonths += $this->end->date->getMonth() - $this->start->date->getMonth();
        if ( $this->fullremmonths < 0 )
        {
            if ( $positive )
            {
                $this->fullremyears--;
                $this->fullremmonths += 12;
            }
            else
            {
                $this->fullremyears++;
                $this->fullremmonths -= 12;
            }
        }

        $this->fullremyears += $this->end->date->getYear() - $this->start->date->getYear();

        
        $this->years    = $this->fullremyears;
        $this->months   = $this->fullremyears * 12 + $this->fullremmonths;
        
        $this->days     = floor( ( $this->end->date->getAsTs() - $this->start->date->getAsTs() ) / 60 / 60 / 24 );
        
        $this->hours    = $this->days * 24 + $this->fullremhours;
        $this->minutes  = $this->hours * 60 + $this->fullremminutes;
        $this->seconds  = $this->minutes * 60 + $this->fullremseconds;
    }
    
    /**
     * returns difference in seconds
     *
     * @return integer seconds
     */
    function getAsSeconds()
    {
        return $this->seconds;
    }
    
    /**
     * returns string with a textual representation of the time-difference
     *
     * @param string $lang
     * @return string
     */
    function getAsString( $lang = 'en' )
    {
        $locale_names['en']['second']   = ' second';
        $locale_names['en']['seconds']  = ' seconds';
        $locale_names['en']['minute']   = ' minute';
        $locale_names['en']['minutes']  = ' minutes';
        $locale_names['en']['hour']     = ' hour';
        $locale_names['en']['hours']    = ' hours';
        $locale_names['en']['day']      = ' day';
        $locale_names['en']['days']     = ' days';
        $locale_names['en']['week']     = ' week';
        $locale_names['en']['weeks']    = ' weeks';
        $locale_names['en']['month']    = ' month';
        $locale_names['en']['months']   = ' months';
        $locale_names['en']['year']     = ' year';
        $locale_names['en']['years']    = ' years';
        $locale_names['en']['and']      = ' and';
        
        $locale_names['de']['second']   = ' Sekunde';
        $locale_names['de']['seconds']  = ' Sekunden';
        $locale_names['de']['minute']   = ' Minute';
        $locale_names['de']['minutes']  = ' Minuten';
        $locale_names['de']['hour']     = ' Stunde';
        $locale_names['de']['hours']    = ' Stunden';
        $locale_names['de']['day']      = ' Tag';
        $locale_names['de']['days']     = ' Tage';
        $locale_names['de']['week']     = ' Woche';
        $locale_names['de']['weeks']    = ' Wochen';
        $locale_names['de']['month']    = ' Monat';
        $locale_names['de']['months']   = ' Monate';
        $locale_names['de']['year']     = ' Jahr';
        $locale_names['de']['years']    = ' Jahre';
        $locale_names['de']['and']      = ' und';
        
        $_ =& $locale_names[$lang];
        
        $this->updatePorperties();
        
        $time = array();
        
        if ( $difference['fullremdays'] > 1 )
        {
            $time[] = $difference['fullremdays'] . $_['days'];
        }
        elseif ( $difference['fullremdays'] == 1 )
        {
            $time[] = $difference['fullremdays'] . $_['day'];
        }
        
        if ( $difference['fullremhours'] > 1 )
        {
            $time[] = $difference['fullremhours'] . $_['hours'];
        }
        elseif ( $difference['fullremhours'] == 1 )
        {
            $time[] = $difference['fullremhours'] . $_['hour'];
        }
        
        if ( $difference['fullremminutes'] > 1 )
        {
            $time[] = $difference['fullremminutes'] . $_['minutes'];
        }
        elseif ( $difference['fullremminutes'] == 1 )
        {
            $time[] = $difference['fullremminutes'] . $_['minute'];
        }
        
        if ( $difference['fullremseconds'] > 1 )
        {
            $time[] = $difference['fullremseconds'] . $_['seconds'];
        }
        elseif ( $difference['fullremseconds'] == 1 )
        {
            $time[] = $difference['fullremseconds'] . $_['second'];
        }
        
        $time = implode( ', ', $time );
        if ( strstr( $time, ',' ) )
        {
            $time = substr_replace( $time, $_['and'], strrpos( $time, ',' ), 1 );
        }
        
        return $time;
    }
}
?>

 
  Advertise on this site Advertise on this site   Site map Site map   Statistics Statistics   Site tips Site tips   Privacy policy Privacy policy   Contact Contact  

For more information send a message to :
info at phpclasses dot org.
Copyright (c) Icontem 1999-2009 PHP Classes - PHP Class Scripts
  PHP Book Reviews - Reviews of books and other products