踩坑实录:前阵子我把面板换成了1Panel,发现水友评论时发现,发布时间都会偏8小时。这问题困扰了我好几天就很难受😂后来我把typecho后台时区改成了GMT标准时间结果前台显示是正常的,但是无论是发布新文章或者什么也不改,每次保存时间就偏8小时。每编辑一次,错一次。
解决方法就是:把PHP时区设成Asia/Shanghai,就好了😂。原因与诊断
我的情况是:
- 后台时区设的是东八区,所以显示时给你 +8 小时;
- 服务器 PHP 时区是 UTC(1Panel 容器默认),保存时却按UTC去解析你框里填的「东八区时间」。所以两边对不上,发布和编辑时就平移8小时。
如果不确定自己的原因可以把下面的诊断脚本到放到Typecho根目录,用浏览器访问即可。代码如下:
这个脚本是腾讯的Hy3写的,它会获取PHP时区、后台时区以及最新一篇文章的真实偏移.
<?php
/**
* Typecho 时区诊断脚本
* 用法:放到 Typecho 根目录,浏览器访问 /typecho_tz_diag.php,看完后务必删除本文件。
*/
error_reporting(E_ALL & ~E_NOTICE);
header('Content-Type: text/plain; charset=utf-8');
function tryRequire(array $paths)
{
foreach ($paths as $p) {
if (file_exists($p)) {
require_once $p;
return $p;
}
}
return false;
}
echo "==== PHP 环境时区 ====\n";
echo "date.timezone (php.ini) : " . (ini_get('date.timezone') ?: '(空)') . "\n";
echo "date_default_timezone_get() : " . date_default_timezone_get() . "\n";
echo "idate('Z') (PHP 时区相对UTC) : " . idate('Z') . " 秒\n\n";
$common = tryRequire(['var/Typecho/Common.php', 'typecho/var/Typecho/Common.php']);
echo "Common.php 加载: " . ($common ?: 'FAILED') . "\n";
$config = tryRequire(['config.inc.php', '../config.inc.php']);
echo "config.inc.php 加载: " . ($config ?: 'FAILED') . "\n\n";
if (!$config) {
echo "未能加载 config.inc.php,脚本中止。请确认本文件放在 Typecho 根目录。\n";
exit;
}
/** @var Typecho_Db $db */
$db = Typecho_Db::get();
echo "==== 数据库 options 中的时区设置 ====\n";
$rows = $db->query($db->select()->from('table.options')
->where('name = ? OR name = ? OR name = ?', 'timezone', 'serverTimezone', 'gmtTimezone'));
foreach ($rows as $r) {
printf(" %-14s = %s\n", $r['name'], $r['value']);
}
echo "\n==== 取最新一篇文章验证 created 偏移 ====\n";
$post = $db->query($db->select('cid', 'created', 'title')->from('table.contents')
->where('type = ?', 'post')->order('cid', Typecho_Db::SORT_DESC)->limit(1));
foreach ($post as $p) {
printf(" 文章 #%d %s\n", $p['cid'], mb_substr($p['title'] ?? '', 0, 20));
echo " created 原始值(绝对时间戳) = " . $p['created'] . "\n";
echo " 按 UTC 解释 = " . gmdate('Y-m-d H:i:s', $p['created']) . "\n";
echo " 按 PHP 时区解释 = " . date('Y-m-d H:i:s', $p['created']) . "\n";
}
echo "\n==== 怎么看结果 ====\n";
echo "1) 后台“设置→基本→时区”应等于 PHP 时区(上面 date_default_timezone_get),中国一般都为 Asia/Shanghai。\n";
echo "2) 你后台看到的这篇文章发布时间,应当等于“按 PHP 时区解释”那一行。\n";
echo " 如果它等于“按 UTC 解释”那一行 -> 说明后台显示被当成了 UTC,options->timezone 没生效。\n";
echo "3) 编辑文章后时间变了,基本就是 getCreated() 解析用的偏移与显示偏移不一致(旧版 Typecho 常见)。\n";
解决办法(1Panel)
把 PHP 时区也改成东八区,和后台对齐就行。
- 1Panel → 网站 → 运行环境,找到你的 PHP 版本点进去;
- 找到更多 → 配置 →配置文件(就是 php.ini);
- 搜索
date.timezone,把那行改成:date.timezone = Asia/Shanghai - 保存并手动重启一下 PHP。
注:封面图片来源于摄图网‘老卢’已获取此图的VRF授权(图片ID:330153954)
好友
摸鱼大王