Вход Регистрация
Файл: upload/include/library/phpfox/date/date.class.php
Строк: 555
<?php
/**
 * [PHPFOX_HEADER]
 */

defined('PHPFOX') or exit('NO DICE!');

/**
 * Handles all time/date related logic for phpFox.
 * 
 * Example to get a current users timezone they are in:
 * <code>
 * Phpfox::getLib('date')->getTimeZone();
 * </code>
 * 
 * Example of our usage of mktime:
 * <code>
 * Phpfox::getLib('date')->mktime(1, 1, 1, 6, 22, 1982);
 * </code>
 * 
 * @copyright        [PHPFOX_COPYRIGHT]
 * @author            Raymond Benc
 * @package         Phpfox
 * @version         $Id: date.class.php 4175 2012-05-16 10:17:50Z Raymond_Benc $
 */
class Phpfox_Date
{
    
/**
     * Array of all the last days for each of the months starting with January
     *
     * @var array
     */
    
private $_aMonthTable = array(
        
31
        
28
        
31
        
30
        
31
        
30
        
31
        
31
        
30
        
31
        
30
        
31
    
);        
    
    
/**
     * Class constructor
     *
     */
    
public function __construct()
    {
        
    }
    
    
/**
     * Gets the current time zone for a person browsing the site. If
     * they have selected a time zone it will return their value, if not
     * it will return the sites default time zone.
     *
     * @param bool $bDst Take DST into account. Set to false to disable DST.
     * @return string Returns the time zone offset from GMT
     */
    
public static function getTimeZone($bDst true)
    {
        static 
$sUserOffSet null;
        if (
PHPFOX_USE_DATE_TIME)
        {
            
$bDst false;
        }
        
        if (
$bDst === false)
        {
            
$sUserOffSet Phpfox::getUserBy('time_zone');        
            
            if (empty(
$sUserOffSet))
            {
                
$sUserOffSet Phpfox::getParam('core.default_time_zone_offset');
            }            
            
            if (
substr($sUserOffSet,0,1) == 'z' && PHPFOX_USE_DATE_TIME)
            {
                
$aTZ Phpfox::getService('core')->getTimeZones();

                
$oGmt = new DateTimeZone('GMT');
                
$mTimeNow = new DateTime(null$oGmt);
                
$oTZ = new DateTimeZone($aTZ[$sUserOffSet]);
                
$oDateTime = new DateTime(null$oTZ);            

                
$sUserOffSet = ($oTZ->getOffset($mTimeNow) / 3600);
            }
            
            return 
$sUserOffSet;        
        }
        
        if (
$sUserOffSet === null)
        {
            
$sUserOffSet Phpfox::getUserBy('time_zone');        
            if (empty(
$sUserOffSet))
            {
                
$sUserOffSet Phpfox::getParam('core.default_time_zone_offset');
            }
        
            if (
self::_isDst() === true && $bDst === true)
            {
                
$sUserOffSet = ($sUserOffSet 1);
            }            
        }    
        
        return 
$sUserOffSet;    
    }    

    
/**
     * Gets the last day of month.
     * 
     * @param int $iMonth The month to get the last day of
     * @param int $iYear You can specify a year, if not we find the current year to work with
     * @return int number of day
     */
    
public function lastDayOfMonth($iMonth$iYear null)
    {
        
// build the date for the very first second of next month
        
$iYear = ($iYear === null) ? date('Y') : (int)$iYear;
        
$iNextMonth $this->mktime(0,0,0$iMonth +1,1$iYear);
        
$iLastDay date('j'$iNextMonth 10);
        return 
$iLastDay;
    }

    
/**
     * Calculates how many days there are between 2 specific dates.
     * 
     * @param int $iTimeStart mktime of the starting date. If null we take current time
     * @param int $iTimeEnd mktime of the ending date
     * @param bool $bRound TRUE will round the calculation and FALSE will return its full calculation
     * @return int    Number of days between $iTimeStart and $iTimeEnd
     */
    
public function daysToDate($iTimeEnd$iTimeStart null$bRound true)
    {
        
// Starting date values
        
if ($iTimeStart !== null)
        {
            
$iMonthStart intval(substr($iTimeStart02));
            
$iDayStart intval(substr($iTimeStart22));
            
$iYearStart intval(substr($iTimeStart44));
            
$iTimeStart $this->mktime(000$iMonthStart$iDayStart$iYearStart);
        }
        else
        {
            
$iTimeStart Phpfox::getTime();
            
$iMonthStart date('m'$iTimeStart);
            
$iDayStart date('d'$iTimeStart);
        }
        
// Ending date Values
        
$iMonthEnd intval(substr($iTimeEnd02));
        
$iDayEnd intval(substr($iTimeEnd22));
        
$iYearEnd = (date('Y'Phpfox::getTime()) > date('Y'$iTimeEnd)) ? date('Y'Phpfox::getTime()) : date('Y'$iTimeEnd);
        
        
$iTimeEnd $this->mktime(2400$iMonthEnd$iDayEnd$iYearEnd);
        
        if (
$bRound == true)
        {
            if (
$iMonthStart == $iMonthEnd && $iDayStart == $iDayEnd// compare day to day (iDayStart and iDayEnd) and months iMonthStart and iMonthEnd
            
{
                return 
0;
            }
            
$iDiff floor(($iTimeEnd $iTimeStart) / (60 60 24));
        }
        else
        {
            
$iDiff = ($iTimeEnd $iTimeStart) / (60 60 24);
        }
        
        return 
$iDiff;
    }

    
/**
     * Gets a specific month and returns the phrase based on the language package being used
     *
     * @param int $iMonth The int value of the month to return, where 1 is January
     * @return string Returns the month as a phrase.
     */
    
public function getMonth($iMonth)
    {        
        switch ((int) 
$iMonth)
        {
            case 
1:
                return 
Phpfox::getPhrase('core.january');
                break;
            case 
2:
                return 
Phpfox::getPhrase('core.february');
                break;
            case 
3:
                return 
Phpfox::getPhrase('core.march');
                break;
            case 
4:
                return 
Phpfox::getPhrase('core.april');
                break;
            case 
5:
                return 
Phpfox::getPhrase('core.may');
                break;
            case 
6:
                return 
Phpfox::getPhrase('core.june');
                break;
            case 
7:
                return 
Phpfox::getPhrase('core.july');
                break;
            case 
8:
                return 
Phpfox::getPhrase('core.august');
                break;
            case 
9:
                return 
Phpfox::getPhrase('core.september');
                break;
            case 
10:
                return 
Phpfox::getPhrase('core.october');
                break;
            case 
11:
                return 
Phpfox::getPhrase('core.november');
                break;
            case 
12:
                return 
Phpfox::getPhrase('core.december');
                break;
            default:
                return 
'';
                break;
        }
    }

    
/**
     * PHP has their own mktime() function, however there are issues related to dates
     * before the year 1901 and the year 2038. This function extends the PHP mktime()
     * function to help resolve those issues. The logic and outcome is still the same as mktime()
     *
     * @see mktime()
     * @param int $iHour The number of the hour. 
     * @param int $iMinute The number of the minute. 
     * @param int $iSecond The number of seconds past the minute. 
     * @param int $iMonth The number of the month. 
     * @param int $iDay The number of the month. 
     * @param int $iYear The number of the year.
     * @return Returns the Unix timestamp of the arguments given
     */
    
public function mktime($iHour$iMinute$iSecond$iMonth$iDay$iYear)
    {
        
$iDay   intval($iDay);
        
$iMonth intval($iMonth);
        
$iYear  intval($iYear);

        if (
$iDay === 0)
        {
            
$iDay 1;
        }

        if (
$iMonth === 0)
        {
            
$iMonth 1;
        }

        if (
$iYear === 0)
        {
            
$iYear 1982;
        }

        if ((
1901 $iYear) and ($iYear 2038))
        {
            return 
mktime($iHour$iMinute$iSecond$iMonth$iDay$iYear);
        }

        if (
$iMonth 12)
        {
            
$iOverlap floor($iMonth 12);
            
$iYear   += $iOverlap;
            
$iMonth  -= $iOverlap 12;
        }
        else
        {
            
$iOverlap ceil(($iMonth) / 12);
            
$iYear   -= $iOverlap;
            
$iMonth  += $iOverlap 12;
        }

        
$iDate 0;
        
// safety check
        
if ($iYear 2070)
        {
            
$iYear 2070;
        }
        
        if (
$iYear >= 1970)
        {
            for (
$iCount 1970$iCount <= $iYear$iCount++)
            {
                
$bLeapYear $this->isLeapYear($iCount);
                if (
$iCount $iYear)
                {
                    
$iDate += 365;
                    if (
$bLeapYear === true)
                    {
                        
$iDate++;
                    }
                }
                else
                {
                    for (
$iCount 0$iCount < ($iMonth 1); $iCount++)
                    {
                        
$iDate += $this->_aMonthTable[$iCount];
                        if ((
$bLeapYear === true) and ($iCount == 1))
                        {
                            
$iDate++;
                        }
                    }
                }
            }

            
$iDate += $iDay 1;
            
$iDate = (($iDate 86400) + ($iHour 3600) + ($iMinute 60) + $iSecond);
        }
        else
        {
            for (
$iCount 1969$iCount >= $iYear$iCount--)
            {
                
$bLeapYear $this->isLeapYear($iCount);
                if (
$iCount $iYear)
                {
                    
$iDate += 365;
                    if (
$bLeapYear === true)
                    {
                        
$iDate++;
                    }
                }
                else
                {
                    for (
$iCount 11$iCount > ($iMonth 1); $iCount--)
                    {
                        
$iDate += $this->_aMonthTable[$iCount];
                        if ((
$bLeapYear === true) and ($iCount == 1))
                        {
                        
$iDate++;
                        }
                    }
                }
            }

            
$iDate += ($this->_aMonthTable[$iMonth 1] - $iDay);
            
$iDate = -(($iDate 86400) + (86400 - (($iHour 3600) + ($iMinute 60) + $iSecond)));
    
            if (
$iDate < -12220185600)
            {
                
$iDate += 864000;
            }
            elseif (
$iDate < -12219321600)
            {
                
$iDate  = -12219321600;
            }
        }

        return 
$iDate;
    }
    
    
/**
     * Checks if the current year passed is a leap year.
     *
     * @param int $iYear The year to check.
     * @return bool Returns TRUE if it is a leap year and FALSE if it is not.
     */
    
public function isLeapYear($iYear)
    {
        if ((
$iYear 4) != 0
        {
            return 
false;
        }

        if (
$iYear 400 == 0
        {
            return 
true;
        } 
        elseif ((
$iYear 1582) and ($iYear 100 == 0)) 
        {
            return 
false;
        }

        return 
true;
    }    
    
    
/**
     * Converts PM time stamp into military time.
     *
     * @param int $iTime PM time
     * @return int Returns military time
     */
    
public function amToPm($iTime)
    {
        
$iCnt 0;
        for (
$i 13$i <= 24$i++)
        {
            
$iCnt++;
            
            if (
$iCnt === (int) $iTime)
            {
                return 
$i;
            }
        }        
    }
    
    
/**
     * Gets the first saturday of the coming week
     *
     * @return int Unix time stamp
     */
     
public function getSaturday()
    {
        return 
$this->mktime(000Phpfox::getTime('m'), (date('d'$this->getWeekEnd()) + 1), Phpfox::getTime('Y'));
    }
    
    
/**
     * Gets the first sunday of the coming week
     *
     * @return int Unix time stamp
     */
     
public function getSunday()
    {
        return 
$this->mktime(235959Phpfox::getTime('m'), (date('d'$this->getWeekEnd()) + 2), Phpfox::getTime('Y'));
    }
    
    
/**
     * Gets the time stamp of the start of this week.
     *
     * @return int Unix time stamp
     */
    
public function getWeekStart()
    {
        return 
$this->mktime(000Phpfox::getTime('m'), (date('d'$this->getWeekEnd()) - 4), Phpfox::getTime('Y'));
    }
    
    
/**
     * Gets the time stamp of the month we are int.
     *
     * @return int Unix time stamp
     */    
    
public function getThisMonth()
    {
        return (
$this->mktime(000Phpfox::getTime('m'), 1Phpfox::getTime('Y')) - 3500);    
    }
    
    
/**
     * Finds the upcoming weekend
     *
     * @param int $iTime By default we use the current time, however you can pass a unix time stamp to check when the next weekend is from that date.
     * @return int Returns How many days until the next weekend
     */
     
public function getWeekEnd($iTime null)
    {
        if(
$iTime == null)
        {
            
$iTime PHPFOX_TIME;
        }

        
$iSat 5;
        
$iDayOfWeek date('w'$iTime);
        
$iDaysUntilSat $iSat $iDayOfWeek;

        return 
$iTime $iDaysUntilSat 24 60 60;
    }    
    
    
/**
     * Converts the time passed based on the offset passed from GMT
     *
     * @param int $iTime Current time stamp to convert from GMT
     * @param string $sOffset Offset of the time zone from GMT
     * @see Provided by http://www.konsort.org/ 
     * @return int Returns the time stamp converted from GMT
     */
    
public function convertFromGmt($iTime$sOffset)
    {
                
// Get the timezones. If PHP 5.3.0 or up, we need to convert the user offset
                
$aTimeZones Phpfox::getService('core')->getTimeZones();
                
// If PHP 5.3.0 or up
                
if(count($aTimeZones) > 100 && isset($aTimeZones[$sOffset]))
                {
                    
// Get the timezone name
                    
$sOffset $aTimeZones[$sOffset];
                    
// Create a DateTimeZone object to check the offset
                    
$oDateTimeZone = new DateTimeZone($sOffset);
                    
// convert temporarily the iTime into human readable time
                    
$sReadTime date("Y-m-d H:i"$iTime);
                    
// Create a DateTime object to check the offset
                    
$oDateTime = new DateTime($sReadTime$oDateTimeZone);
                    
// Get the offset against GMT
                    
$sOffset $oDateTimeZone->getOffset($oDateTime);
                    
// Divide it into 3600 to get the total amount of hours
                    
$sOffset = (float)($sOffset 3600);
                    
//unset all the objects we do not longer need
                    
unset($oDateTime);
                    unset(
$oDateTimeZone);
                }
                
//unset all the objects we do not longer need
                
unset($aTimeZones); 

        return (int) (!empty(
$sOffset) ? (substr($sOffset01) == '-' ? ($iTime - (substr($sOffset1) * 3600)) : $iTime + ($sOffset 3600)) : $iTime);
    }     
    
    
/**
     * Converts the time passed based on the offset passed into GMT
     *
     * @param int $iTime Current time stamp to convert into GMT
     * @param string $sOffset Offset of the time zone to GMT
     * @see Provided by http://www.konsort.org/
     * @return int Returns the time stamp as GMT
     */    
    
public function convertToGmt($iTime)
    {
        
$sUserOffSet $this->getGmtOffset($iTime);        

                
// Get the timezones. If PHP 5.3.0 or up, we need to convert the user offset
                
$aTimeZones Phpfox::getService('core')->getTimeZones();
                
// If PHP 5.3.0 or up
                
if(count($aTimeZones) > 100 && isset($aTimeZones[$sUserOffSet]))
                {
                    
// Get the timezone name
                    
$sUserOffSet $aTimeZones[$sUserOffSet];
                    
// Create a DateTimeZone object to check the offset
                    
$oDateTimeZone = new DateTimeZone($sUserOffSet);
                    
// convert temporarily the iTime into human readable time
                    
$sReadTime date("Y-m-d H:i"$iTime);
                    
// Create a DateTime object to check the offset
                    
$oDateTime = new DateTime($sReadTime$oDateTimeZone);
                    
// Get the offset against GMT
                    
$sUserOffSet $oDateTimeZone->getOffset($oDateTime);
                    
// Divide it into 3600 to get the total amount of hours
                    
$sUserOffSet = (float)($sUserOffSet 3600);
                    
//unset all the objects we do not longer need
                    
unset($oDateTime);
                    unset(
$oDateTimeZone);
                }
                
//unset all the objects we do not longer need
                
unset($aTimeZones); 

        return (int) (!empty(
$sUserOffSet) ? (substr($sUserOffSet01) == '-' ? ($iTime + (substr($sUserOffSet1) * 3600)) : $iTime - ($sUserOffSet 3600)) : $iTime);
    }
    
    
/**
     * Converts a time stamp into a human readable phrase.
     *
     * @param int $iTime Time stamp to convert
     * @param string $sDefault Default phrase to use with the display of the time stamp
     * @return string Returns the readable phrase with the time stamp included.
     */
    
public function convertTime($iTime$sDefault null)
    {
        
$iSeconds = (int) round(abs(PHPFOX_TIME $iTime));
        
$iMinutes = (int) round($iSeconds 60);        

        if (
$iMinutes 1)
        {
            if (
$iSeconds === || $iSeconds === 1)
            {
                return 
Phpfox::getPhrase('core.1_second_ago');
            }
            return 
Phpfox::getPhrase('core.total_seconds_ago', array('total' => $iSeconds));
        }
        
        if (
$iMinutes 60)
        {
            if (
$iMinutes === || $iMinutes === 1)
            {
                return 
Phpfox::getPhrase('core.1_minute_ago');
            }
            return 
Phpfox::getPhrase('core.total_minutes_ago', array('total' => $iMinutes));
        }
        
        
$iHours = (int) round(floatval($iMinutes) / 60.0);
        
        if (
$iHours 24)
        {
            if (
$iHours === || $iHours === 1)
            {
                return 
Phpfox::getPhrase('core.1_hour_ago');
            }
            
            return 
Phpfox::getPhrase('core.total_hours_ago', array('total' => $iHours));
        }        
        
        if (
$iHours 48 && ((int) date('d'PHPFOX_TIME) - 1) == date('d'$iTime))
        {
            return 
Phpfox::getPhrase('core.yesterday') . ', ' Phpfox::getTime(Phpfox::getParam('core.conver_time_to_string'), $iTime);
        }    
        
        return 
Phpfox::getTime(Phpfox::getParam(($sDefault === null 'core.global_update_time' $sDefault)), $iTime);
    }
    
    
/**
     * Gets the offset from the current timezone being used to GMT.
     *
     * @param int $iTime Current time stamp to check
     * @return int Returns GMT offset
     */
    
public function getGmtOffset($iTime)
    {        
        return 
Phpfox::getTimeZone();
    }
    
    
/**
     * Modify the current hour of a time stamp based on DST settings
     *
     * @param string $sTime Time stamp
     * @param bool $bAmPm Not being used at the moment
     * @return int Converted time stamp is returned
     */
    
public function modifyHours($sTime$bAmPm false)
    {    
        
$iCurrentHour = (int) Phpfox::getTime('H');        
    
        if (
substr($sTime01) == '+')
        {
            
$iTime = (int) substr_replace($sTime''01);
        }                
                
        
$iNewTime = ($iTime $iCurrentHour);
                
        if (
$iNewTime >= 24)
        {
            
$iNewTime = ($iNewTime 24);    
        }        
        
        return 
$iNewTime;
    }
    
    
/**
     * Check to see if we are to use DST support.
     *
     * @return bool TRUE if we use DST, FALSE if we don't
     */
    
private static function _isDst()
    {            
        if (!
Phpfox::getParam('core.identify_dst'))
        {
            return 
false;
        }
        
        return (
Phpfox::getUserBy('dst_check') ? true false);    
    }
}

?>
Онлайн: 0
Реклама