服务器存在时差导致博客存在时差的解决方案
注: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本身的BUG)
注:Typecho 1.1正式版已修复此Bug
微语功能能不能写一篇文章介绍一下怎么部署?
就是把评论模块魔改一下 样式重弄一下 然后把phpifhaslogin那个把评论框给包上就可以了
搞定!