Login   Register  
PHP Classes
elePHPant
Icontem

File: Timespan.class.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Cybot  >  phpDateTime  >  Timespan.class.php  >  Download  
File: Timespan.class.php
Role: Class source
Content type: text/plain
Description: class Timespan
Class: phpDateTime
Manipulating dates, times, time intervals
Author: By
Last change: please refer to the changelog on sourceforge
Date: 9 years ago
Size: 13,921 bytes
 

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;
    }
}
?>