服务器存在时差导致博客存在时差的解决方案

尚寂新
尚寂新
2017/01/18 07:33

注: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也可以)

改完之后,原来错位的时间——全部回来了!

已有 5 条评论 (旧评论在前)
  1. 尚寂新 博主
    回复
    2017-01-18 07:35 Windows 7

    但是...这出现了一个副作用,文章无法再次编辑 否则文章会陷入时间的逻辑当中,导致文章无法在博客显示,请大家周知(好像是Typecho本身的BUG)

    1. 尚寂新 博主
      回复
      2018-01-21 08:08 Android 5.1

      注:Typecho 1.1正式版已修复此Bug

  2. 云武
    回复
    云武
    2018-02-20 19:21 Windows NT10

    微语功能能不能写一篇文章介绍一下怎么部署?

    1. 尚寂新 博主
      回复
      2018-02-20 19:37 Android 5.1

      就是把评论模块魔改一下 样式重弄一下 然后把phpifhaslogin那个把评论框给包上就可以了

      1. 云武
        回复
        云武
        2018-02-20 20:08 Windows NT10

        搞定!

添加新评论 (Markdown Supported)
(ノ°ο°)ノ