in 折腾博客 (702℃)

注:Typecho 1.1 正式版 已修复此BUG
前两天晚上机芯安装上了这个handsome主题,装完摆弄一下结果发现...

Good morning,尚寂新~

一脸懵逼的机芯

当时机芯脸上一堆黑人问号??(当时是在晚上!)由于太困也没在意。过了两天之后编辑时光机的微语,意外的发现——时间怎么不对?仔细检查一看,发现博客时间整整比北京时间慢了8个小时。我便求助主题作者,作者也指出了一个解决方案...

Typecho 计算时间是用格林威治标准时间 + (后台设置的时区偏移 - 服务器的时区偏移)。Typecho 计算时间是用格林威治标准时间 + (后台设置的时区偏移 - 服务器的时区偏移)。

翻了一次文件夹,看见了 usr/typecho/ 文件夹中有叫 Date.php

开始解决问题

上面的是前辈们找出的规律,机芯也尝试按他们方案解决了下...由于机芯不会php,弄得主站无法访问(幸好当时留个心眼子备份了文件),于是机芯灵稽一动,想出来个方法(还是动那个文件)。下面放修改好的代码,方便遇到同样问题的小伙伴们修改自己的博客~

    <?php
    
    /**
     * 日期处理
     *
     * @author qining
     * @category typecho
     * @package Date
     */
    class Typecho_Date
    {
        /**
         * 期望时区偏移
         *
         * @access public
         * @var integer
         */
        public static $timezoneOffset = 0;
    
        /**
         * 服务器时区偏移
         *
         * @access public
         * @var integer
         */
        public static $serverTimezoneOffset = 0;
    
        /**
         * 当前的GMT时间戳
         *
         * @access public
         * @var integer
         */
        public static $gmtTimeStamp;
    
        /**
         * 可以被直接转换的时间戳
         *
         * @access public
         * @var integer
         */
        public $timeStamp = 0;
    
        /**
         * 初始化参数
         *
         * @access public
         * @param integer $gmtTime GMT时间戳
         * @return void
         */
        public function __construct($gmtTime)
        {
            $this->timeStamp = $gmtTime + self::$timezoneOffset ;
        }
    
        /**
         * 设置当前期望的时区偏移
         *
         * @access public
         * @param integer $offset
         * @return void
         */
        public static function setTimezoneOffset($offset)
        {
            self::$timezoneOffset = $offset;
            self::$serverTimezoneOffset = idate('Z');
        }
    
        /**
         * 获取格式化时间
         *
         * @access public
         * @param string $format 时间格式
         * @return string
         */
        public function format($format)
        {
            return date($format, $this->timeStamp);
        }
    
        /**
         * 获取国际化偏移时间
         *
         * @access public
         * @return string
         */
        public function word()
        {
            return Typecho_I18n::dateWord($this->timeStamp, self::gmtTime() + self::$timezoneOffset );
        }
    
        /**
         * 获取单项数据
         *
         * @access public
         * @param string $name 名称
         * @return integer
         */
        public function __get($name)
        {
            switch ($name) {
                case 'year':
                    return date('Y', $this->timeStamp);
                case 'month':
                    return date('m', $this->timeStamp);
                case 'day':
                    return date('d', $this->timeStamp);
                default:
                    return;
            }
        }
    
        /**
         * 获取GMT时间
         *
         * @access public
         * @return integer
         */
        public static function gmtTime()
        {
            return self::$gmtTimeStamp ? self::$gmtTimeStamp : (self::$gmtTimeStamp = @gmmktime());
        }
    }

一个小疑问

噫?这不是和官方的文件一样吗?
不不不!这个文件还是有改动的。前文提到Typecho计算时间是用格林威治标准时间 + (后台设置的时区偏移 - 服务器的时区偏移),咱们把这个公式改一下不就可以了吗~把服务器时区偏移给去掉就可以了,也就是

格林威治标准时间 + 后台设置的时区偏移

注:每个时间函数后面必须有空格才会生效(如果搞不明白的话看我上面的code也可以)
改完之后,机芯发现原来错位的时间——全部回来了!
如你的博客也有这种现象,不妨用一下机芯的方案~希望本文能帮助大家

 |   | 

相关标签:#时区 #typecho

许可协议: 署名-相同方式共享 4.0 国际 转载请保留原文链接及作者