个人成长计划
其大无外,其小无内。
沪ICP备2022018381号-2
京公网安备 11011502037542号自豪地使用 Typecho 建站搭配使用 🌻Sunny 主题博主 昨天 17:11 在线 · 当前 1 人活跃

沪ICP备2022018381号-2

京公网安备 11011502037542号

已运行 6 年 7 天 6 小时 9 分

Powered by Typecho & Sunny

昨天 17:11在线 · 2 人活跃 · 约 87 ms

网站背景图
个人成长计划 不问而告谓之傲,问一而告二谓之囋。
文章

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

Ayiya

·

折腾笔记

·

踩坑实录:前阵子我把面板换成了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)
现在已有 304 次阅读,1 条评论,0 人点赞
评论:共1条
发表
  1. 头像

    好友

    摸鱼大王
    这一般都是主题要做的事😲,还真要你找出其他解决办法了
    Android Chrome 湖南
功能 探索 消息

足迹

你还不曾留下足迹..

音乐单

随机文章

夜晚

💬
你还不曾留言过
博主 不再显示
博主
未知作品 歌曲封面
立即安装