⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dateobject.php

📁 Bug tracker, and reporter.
💻 PHP
📖 第 1 页 / 共 3 页
字号:
            $timestamp -= $sec;            if (!isset($i)) {                $i = $act;            }            // iterate the max last 10 years            do {                --$i;                $day = $timestamp;                $timestamp += 31536000;                $leapyear = self::isYearLeapYear($i);                if ($leapyear === true) {                    $timestamp += 86400;                }                if ($timestamp >= 0) {                    $year = $i;                    break;                }            } while ($timestamp < 0);            $secondsPerYear = 86400 * ($leapyear ? 366 : 365) + $day;            $timestamp = $day;            // iterate through months            for ($i = 12; --$i >= 0;) {                $day = $timestamp;                $timestamp += self::$_monthTable[$i] * 86400;                if (($leapyear === true) and ($i == 1)) {                    $timestamp += 86400;                }                if ($timestamp >= 0) {                    $month  = $i;                    $numday = self::$_monthTable[$i];                    if (($leapyear === true) and ($i == 1)) {                        ++$numday;                    }                    break;                }            }            $timestamp  = $day;            $numberdays = $numday + ceil(($timestamp + 1) / 86400);            $timestamp += ($numday - $numberdays + 1) * 86400;            $hours      = floor($timestamp / 3600);        } else {            // iterate through years            for ($i = 1970;;$i++) {                $day = $timestamp;                $timestamp -= 31536000;                $leapyear = self::isYearLeapYear($i);                if ($leapyear === true) {                    $timestamp -= 86400;                }                if ($timestamp < 0) {                    $year = $i;                    break;                }            }            $secondsPerYear = $day;            $timestamp = $day;            // iterate through months            for ($i = 0; $i <= 11; $i++) {                $day = $timestamp;                $timestamp -= self::$_monthTable[$i] * 86400;                if (($leapyear === true) and ($i == 1)) {                    $timestamp -= 86400;                }                if ($timestamp < 0) {                    $month  = $i;                    $numday = self::$_monthTable[$i];                    if (($leapyear === true) and ($i == 1)) {                        ++$numday;                    }                    break;                }            }            $timestamp  = $day;            $numberdays = ceil(($timestamp + 1) / 86400);            $timestamp  = $timestamp - ($numberdays - 1) * 86400;            $hours = floor($timestamp / 3600);        }        $timestamp -= $hours * 3600;        $month  += 1;        $minutes = floor($timestamp / 60);        $seconds = $timestamp - $minutes * 60;        if ($fast === true) {            $array = array(                'seconds' => $seconds,                'minutes' => $minutes,                'hours'   => $hours,                'mday'    => $numberdays,                'mon'     => $month,                'year'    => $year,                'yday'    => floor($secondsPerYear / 86400),            );        } else {            $dayofweek = self::dayOfWeek($year, $month, $numberdays);            $array = array(                    'seconds' => $seconds,                    'minutes' => $minutes,                    'hours'   => $hours,                    'mday'    => $numberdays,                    'wday'    => $dayofweek,                    'mon'     => $month,                    'year'    => $year,                    'yday'    => floor($secondsPerYear / 86400),                    'weekday' => gmdate('l', 86400 * (3 + $dayofweek)),                    'month'   => gmdate('F', mktime(0, 0, 0, $month, 1, 1971)),                    0         => $otimestamp            );        }        if (isset(self::$_cache)) {            self::$_cache->save( serialize($array), $id);        }        return $array;    }    /**     * Internal getWeekNumber function for handling 64bit timestamps     *     * Returns the ISO 8601 week number of a given date     *     * @param  integer  $year     * @param  integer  $month     * @param  integer  $day     * @return integer     */    protected function weekNumber($year, $month, $day)    {        if ((1901 < $year) and ($year < 2038)) {            return (int) date('W', mktime(0, 0, 0, $month, $day, $year));        }        $dayofweek = self::dayOfWeek($year, $month, $day);        $firstday  = self::dayOfWeek($year, 1, 1);        if (($month == 1) and (($firstday < 1) or ($firstday > 4)) and ($day < 4)) {            $firstday  = self::dayOfWeek($year - 1, 1, 1);            $month     = 12;            $day       = 31;        } else if (($month == 12) and ((self::dayOfWeek($year + 1, 1, 1) < 5) and                   (self::dayOfWeek($year + 1, 1, 1) > 0))) {            return 1;        }        return intval (((self::dayOfWeek($year, 1, 1) < 5) and (self::dayOfWeek($year, 1, 1) > 0)) +               4 * ($month - 1) + (2 * ($month - 1) + ($day - 1) + $firstday - $dayofweek + 6) * 36 / 256);    }    /**     * Internal _range function     * Sets the value $a to be in the range of [0, $b]     *     * @param float $a - value to correct     * @param float $b - maximum range to set     */    private function _range($a, $b) {        while ($a < 0) {            $a += $b;        }        while ($a >= $b) {            $a -= $b;        }        return $a;    }    /**     * Calculates the sunrise or sunset based on a location     *     * @param  array  $location  Location for calculation MUST include 'latitude', 'longitude', 'horizon'     * @param  bool   $horizon   true: sunrise; false: sunset     * @return mixed  - false: midnight sun, integer:     */    protected function calcSun($location, $horizon, $rise = false)    {        // timestamp within 32bit        if (abs($this->_unixTimestamp) <= 0x7FFFFFFF) {            if ($rise === false) {                return date_sunset($this->_unixTimestamp, SUNFUNCS_RET_TIMESTAMP, $location['latitude'],                                   $location['longitude'], 90 + $horizon, $this->_offset / 3600);            }            return date_sunrise($this->_unixTimestamp, SUNFUNCS_RET_TIMESTAMP, $location['latitude'],                                $location['longitude'], 90 + $horizon, $this->_offset / 3600);        }        // self calculation - timestamp bigger than 32bit        // fix circle values        $quarterCircle      = 0.5 * M_PI;        $halfCircle         =       M_PI;        $threeQuarterCircle = 1.5 * M_PI;        $fullCircle         = 2   * M_PI;        // radiant conversion for coordinates        $radLatitude  = $location['latitude']   * $halfCircle / 180;        $radLongitude = $location['longitude']  * $halfCircle / 180;        // get solar coordinates        $tmpRise       = $rise ? $quarterCircle : $threeQuarterCircle;        $radDay        = $this->date('z',$this->_unixTimestamp) + ($tmpRise - $radLongitude) / $fullCircle;        // solar anomoly and longitude        $solAnomoly    = $radDay * 0.017202 - 0.0574039;        $solLongitude  = $solAnomoly + 0.0334405 * sin($solAnomoly);        $solLongitude += 4.93289 + 3.49066E-4 * sin(2 * $solAnomoly);        // get quadrant        $solLongitude = $this->_range($solLongitude, $fullCircle);        if (($solLongitude / $quarterCircle) - intval($solLongitude / $quarterCircle) == 0) {            $solLongitude += 4.84814E-6;        }        // solar ascension        $solAscension = sin($solLongitude) / cos($solLongitude);        $solAscension = atan2(0.91746 * $solAscension, 1);        // adjust quadrant        if ($solLongitude > $threeQuarterCircle) {            $solAscension += $fullCircle;        } else if ($solLongitude > $quarterCircle) {            $solAscension += $halfCircle;        }        // solar declination        $solDeclination  = 0.39782 * sin($solLongitude);        $solDeclination /=  sqrt(-$solDeclination * $solDeclination + 1);        $solDeclination  = atan2($solDeclination, 1);        $solHorizon = $horizon - sin($solDeclination) * sin($radLatitude);        $solHorizon /= cos($solDeclination) * cos($radLatitude);        // midnight sun, always night        if (abs($solHorizon) > 1) {            return false;        }        $solHorizon /= sqrt(-$solHorizon * $solHorizon + 1);        $solHorizon  = $quarterCircle - atan2($solHorizon, 1);        if ($rise) {            $solHorizon = $fullCircle - $solHorizon;        }        // time calculation        $localTime     = $solHorizon + $solAscension - 0.0172028 * $radDay - 1.73364;        $universalTime = $localTime - $radLongitude;        // determinate quadrant        $universalTime = $this->_range($universalTime, $fullCircle);        // radiant to hours        $universalTime *= 24 / $fullCircle;        // convert to time        $hour = intval($universalTime);        $universalTime    = ($universalTime - $hour) * 60;        $min  = intval($universalTime);        $universalTime    = ($universalTime - $min) * 60;        $sec  = intval($universalTime);        return $this->mktime($hour, $min, $sec, $this->date('m', $this->_unixTimestamp),                             $this->date('j', $this->_unixTimestamp), $this->date('Y', $this->_unixTimestamp),                             -1, true);    }    /**     * Sets a new timezone for calculation of $this object's gmt offset.     * For a list of supported timezones look here: http://php.net/timezones     * If no timezone can be detected or the given timezone is wrong UTC will be set.     *     * @param  string  $zone      OPTIONAL timezone for date calculation; defaults to date_default_timezone_get()     * @return string  actual set timezone string     * @throws Zend_Date_Exception     */    public function setTimezone($zone = null)    {        $oldzone = @date_default_timezone_get();        if ($zone === null) {            $zone = $oldzone;        }        // throw an error on false input, but only if the new date extension is available        if (function_exists('timezone_open')) {            if (!@timezone_open($zone)) {                require_once 'Zend/Date/Exception.php';                throw new Zend_Date_Exception("timezone ($zone) is not a known timezone", $zone);            }        }        // this can generate an error if the date extension is not available and a false timezone is given        $result = @date_default_timezone_set($zone);        if ($result === true) {            $this->_offset   = mktime(0, 0, 0, 1, 2, 1970) - gmmktime(0, 0, 0, 1, 2, 1970);            $this->_timezone = $zone;        }        date_default_timezone_set($oldzone);        if (($zone == 'UTC') or ($zone == 'GMT')) {            $this->_dst = false;        }        return $result;    }    /**     * Return the timezone of $this object.     * The timezone is initially set when the object is instantiated.     *     * @return  string  actual set timezone string     */    public function getTimezone()    {        return $this->_timezone;    }    /**     * Return the offset to GMT of $this object's timezone.     * The offset to GMT is initially set when the object is instantiated using the currently,     * in effect, default timezone for PHP functions.     *     * @return  integer  seconds difference between GMT timezone and timezone when object was instantiated     */    public function getGmtOffset()    {        return $this->_offset;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -