Typecho时间偏移修复(1Panel实操版)

踩坑实录:前阵子我把面板换成了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 时区也改成东八区,和后台对齐就行。

  1. 1Panel → 网站 → 运行环境,找到你的 PHP 版本点进去;
  2. 找到更多 → 配置 →配置文件(就是 php.ini);
  3. 搜索 date.timezone,把那行改成: date.timezone = Asia/Shanghai
  4. 保存并手动重启一下 PHP。
注:封面图片来源于摄图网‘老卢’已获取此图的VRF授权(图片ID:330153954)

4 条评论

取消回复
  1. 摸鱼大王

    这一般都是主题要做的事😲,还真要你找出其他解决办法了

    湖南省联通 Android
    1. Ayiya
      Ayiya 博主
      回复
      2026年9月24日 回复 @摸鱼大王 :

      我也感觉是主题问题,但是其他人都没出现这个问题😂

      上海市联通 Windows
  2. 免费算命

    文章不错支持一下,非常喜欢

    广西钦州市联通 Windows
  3. 狗蛋
    狗蛋 神秘人
    回复

    :blobcat-googly-supersayin::blobcat-googly-party::blobcat-googly-party::blobcat-googly-party::blobcat-googly-party::blobcat-googly-party::blobcat-googly-party::blobcat-googly-party:

    向日葵星系 · 猎户座 空调遥控器