codeigniter 配置中国标准时间需统一使用 asia/shanghai 时区标识符,ci4 在 app/config/app.php 中修改 $timezone,ci3 则需在入口文件或基础控制器中调用 date_default_timezone_set(),同时确保 php 环境 date.timezone 一致,并注意 datetime 实例化时显式指定时区以避免偏差。

CodeIgniter 配置时区改为中国标准时间(CST),核心是统一使用 Asia/Shanghai,而不是 GMT+8 或其他别名。这个时区标识符能正确处理夏令时逻辑(虽然中国不实行夏令时,但 PHP 仍需标准命名以保障兼容性)。
在 CodeIgniter 4 中设置时区
CodeIgniter 4 的时区配置位于应用级配置文件中,修改后对日志、缓存、模型时间戳等内置功能生效:
- 打开 app/Config/App.php
- 找到
public $timeZone = 'UTC';这一行 - 将其改为:
public $timeZone = 'Asia/Shanghai'; - 保存后建议执行
php spark cache:clear清除配置缓存
在 CodeIgniter 3 中设置时区
CI3 没有内置的全局时区配置项,需手动干预启动流程,推荐两种可靠方式:
-
方式一:在入口文件中强制设定 —— 编辑 index.php,在
require_once FCPATH . 'vendor/autoload.php';之后、任何业务代码之前添加:date_default_timezone_set('Asia/Shanghai'); - 方式二:在基础控制器中统一初始化 —— 在 application/core/MY_Controller.php 的构造方法里加入同一行代码,确保所有控制器继承时自动生效
同时确保 PHP 环境层面一致
仅改框架配置不能完全避免时间偏差,尤其当使用原生 date()、strtotime() 或 DateTime 类时,它们依赖 PHP 底层默认时区:
- 检查服务器 php.ini 中的
date.timezone是否已设为"Asia/Shanghai" - 若无法修改 php.ini(如共享主机),必须在入口文件开头用
date_default_timezone_set()强制覆盖 - 可通过
echo date_default_timezone_get();验证当前生效的时区
注意日期操作中的时区陷阱
即使时区设对了,以下情况仍可能出错:
- 数据库字段为
DATETIME且存储的是本地时间,但查询时用new DateTime()未指定时区,会按Asia/Shanghai解析字符串,导致偏移错误 - 做日期范围查询时(如查“今天”),应统一用
(new DateTime('today', new DateTimeZone('Asia/Shanghai')))->format('Y-m-d'),而非依赖系统默认 - 从 MySQL 读取时间后转成
DateTime对象,建议显式传入时区:new DateTime($row['created_at'], new DateTimeZone('Asia/Shanghai'))











