-
故障现象
前几日无意发现,本博客站点后台文章发布后,来到前端展示文章列表页面,文章展示的发布时间却显示为8小时前发布的!回到后台,查看发布时间是正常的刚刚发布,这是为什么呢?
-
解决过程
①、让我们首先确认是否是系统时间或时区的问题;
[root@oxblog ~]# date -R
Mon, 12 Jun 2017 11:49:39 +0800
[root@oxblog ~]# LANG="utf-8" hwclock
Mon Jun 12 11:49:41 2017 -1.125553 seconds
[root@oxblog ~]# cat /etc/sysconfig/clock
ZONE="Asia/Shanghai"
可以确认系统时间也是没问题的,其实想想也是,如果系统时间有问题,其在后台也不会正确;
②、依照上面的解决思路,我们先找到网页的源代码的出处;
!--通过浏览器F12工具对网页进行检查,找到其样式:entry-meta-date;于是我到主题目录下检索--!
[root@oxblog jinsomB]# grep -ri entry-meta-date ./
./template-tags.php: printf( __( '<span class="entry-meta-date"><time datetime="%1$s">%2$s</time></span>', 'framework' ),
[root@oxblog jinsomB]# vim template-tags.php
function ht_human_time_diff($from, $to){
$to=($to==null ? time() : $to);
$diff = $to-$from;
if( $diff >= 0 && $diff < 10 ){
return __('刚刚', 'framework');
} elseif ($diff >= 10 && $diff < 30) {
return __('小时前', 'framework');
} else {
return '约 '.human_time_diff($from, $to) . ' ' . __('前', 'framework');
}
}
if ( ! function_exists( 'ht_entry_meta_date' ) ) :
function ht_entry_date() {
$post_date = ht_human_time_diff( get_the_time('U'), current_time('timestamp')) ;
printf( __( '<span class="entry-meta-date"><time datetime="%1$s">%2$s</time></span>', 'framework' ),
esc_attr( get_the_date( 'c' ) ),
esc_html( $post_date )
);
}
endif;
!--首先我通过主题目录下footer.php文件试图调用这个变量--!
[root@oxblog jinsomB]# vim footer.php
<script type="text/javascript">
alert(""+<?php echo current_time('timestamp'); ?>);
</script>
!--我在文件最后body之前加入一个srcript,如此当我们刷新页面时,就会弹出一个小窗口,里面正是这个变量的取值:1497269765--!
!--没错这段数字正是linux系统的时间戳,关于它的讲解,道友可以本站内搜索‘时间戳’得解析--!
123[root@oxblog jinsomB]# LANG="utf-8" date -d @1497269765
Mon Jun 12 20:16:05 CST 2017
[root@oxblog jinsomB]# date +%s
1497240965
[root@oxblog jinsomB]# expr 1497240965 - 1497269765
-28800
[root@oxblog jinsomB]# LANG="utf-8" date -d @1497269765
Mon Jun 12 20:16:05 CST 2017
[root@oxblog jinsomB]# LANG="utf-8" date -d @1497240965
Mon Jun 12 12:16:05 CST 2017
[root@oxblog jinsomB]# date -R
Mon, 12 Jun 2017 12:25:41 +0800
③、通过运算代码改变current_time代表的当前时间来还原正常效果;
[root@oxblog jinsomB]# vim template-tags.php
if ( ! function_exists( 'ht_entry_meta_date' ) ) :
function ht_entry_date() {
$post_date = ht_human_time_diff( get_the_time('U'), current_time('timestamp'-28800)) ;
printf( __( '<span class="entry-meta-date"><time datetime="%1$s">%2$s</time></span>', 'framework' ),
esc_attr( get_the_date( 'c' ) ),
esc_html( $post_date )
);
}
endif;
!--如上我们只需要在此变量后面减少28800,也就是8小时即可让其变相等同于系统当前时间--!
④、修改定义current_time变量的函数来改变其变量的值;
!--我们既然知道这是个变量,那么它的值不可能平白就有的,一定有个函数或方式赋予它的值--!
!--其实这个变量是wordpress自己定义的,所以同样我们检索一下它在wp安装目录下--!
[root@oxblog htdocs]# grep -ri current_time $(find ./ -type f -name '*.php') | awk -F: '{print $2 }'| grep function
function current_time( $type, $gmt = 0 ) {
[root@oxblog htdocs]# grep -ri current_time $(find ./ -type f -name '*.php') | grep "$gmt = 0"
./wp-includes/functions.php:function current_time( $type, $gmt = 0 ) {
vim wp-includes/functions.php
function current_time( $type, $gmt = 0 ) {
switch ( $type ) {
case 'mysql':
return ( $gmt ) ? gmdate( 'Y-m-d H:i:s' ) : gmdate( 'Y-m-d H:i:s', ( time() + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) ) );
case 'timestamp':
return ( $gmt ) ? time() : time() + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS );
default:
return ( $gmt ) ? date( $type ) : date( $type, time() + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) );
}
}
!--直接修改current_time函数gmt参数的值为8--!
[root@oxblog htdocs]# vim wp-includes/functions.php
function current_time( $type, $gmt = 8 ) {
⑤、修改主题里面current_time取值代码参数来直接修改其变量的值;
!--通过上面我们已经知道current_time变量取值的原理,如此我们除了上面④中的方法,我们还可以直接修改主题中的那个调用文件处的参数,直接修改其变量--!
function ht_entry_date() {
$post_date = ht_human_time_diff( get_the_time('U'), current_time('timestamp',8)) ;
printf( __( '<span class="entry-meta-date"><time datetime="%1$s">%2$s</time></span>', 'framework' ),
esc_attr( get_the_date( 'c' ) ),
esc_html( $post_date )
);
}
endif;
如上,我在代码第二行最后出加上了,8;意思也就是简介修改了gmt的值,是的这就是代码的神奇;
⑥、修改系统时区及扩展
如上,知道了来龙去脉,我们是不是可以直接修改系统时区为UTC0或GMT0时区,显然是可行的;
不过这里就不演示了,但博主在解决此问题的时候,网上查到有的方法是修改php和apache或wp配置文件中配置的时区,其实也是一种方法,但显然很多都说最后这种方法是不可行的;我想看了上面的剖析,这里大家应该知道原因了,那就是出发点不对;就像①中排除系统时间和时区一样,我们已经确定系统时区和时间是没有问题的,你还要总是通过各种方法去修改,认为是有问题的地方,把时区修改成上海的时区,显然是没有效果的,但是如果如上我们把它修改成utc0的时区,或许就成功了;
不过虽然很多弯路,但这正是解决问题的过程和谨慎,在没有弄清原因的情况下,一切假设都是可能的;
让我找到了主题自带的一些function功能,前面全手敲,现在又得改- -。
有点复杂,看不懂啊!哈哈
没玩过博客,感觉还挺好玩!
爷,收下我的膝盖!
好几年没用过博客了,支持下!