codeigniter 时区配置需统一使用 asia/shanghai:ci4 在 app.php 中设 $timezone;ci3 在入口或基础控制器中调用 date_default_timezone_set();同时确保 php.ini 或入口文件同步设置 php 时区,并在日期操作中显式指定时区避免偏差。

CodeIgniter 配置时区,关键在于统一使用 Asia/Shanghai 这个标准时区标识符,而不是 GMT+8、CST 或 PRC 等非标准写法。不同版本处理方式不同,需按版本区分操作,且必须兼顾框架层、PHP 环境层和代码使用层三方面,否则仍可能出现时间偏差。
CI4:在 App.php 中修改全局时区
CodeIgniter 4 提供了内置的时区配置项,推荐优先使用此方式:
- 打开 app/Config/App.php
- 找到
public $timeZone = 'UTC'; - 将其改为
public $timeZone = 'Asia/Shanghai'; - 保存后执行
php spark cache:clear清除配置缓存,确保新设置生效 - 该设置会影响日志时间戳、模型自动填充的
created_at/updated_at、缓存过期判断等内置功能
CI3:手动调用 date_default_timezone_set()
CodeIgniter 3 没有框架级时区配置项,需主动干预运行环境:
- 推荐在 application/core/MY_Controller.php 的构造方法中添加:
date_default_timezone_set('Asia/Shanghai'); - 若项目无自定义基础控制器,可改在 index.php 入口文件中,在
require_once FCPATH . 'vendor/autoload.php';之后、任何业务逻辑之前插入同一行代码 - 不建议只在 config.php 中用
date_default_timezone_set(),因为 CI3 加载配置较晚,部分系统函数(如日志初始化)可能已按默认时区执行
确保 PHP 环境时区同步
仅改框架配置不能覆盖所有场景,原生 PHP 函数(date()、strtotime()、new DateTime())依赖 PHP 底层默认时区:
- 检查服务器 php.ini 中
date.timezone是否设为"Asia/Shanghai" - 若无法修改 php.ini(如虚拟主机),必须在入口文件开头强制设定:
date_default_timezone_set('Asia/Shanghai'); - 可通过
echo date_default_timezone_get();输出当前生效时区,验证是否正确
避免日期操作中的时区陷阱
即使时区设对了,以下写法仍易出错:
- 使用
new DateTime()时不显式传入时区对象,会按默认时区解析字符串,可能导致跨时区误判 - 查询“今天”这类相对时间,应写成:
(new DateTime('today', new DateTimeZone('Asia/Shanghai')))->format('Y-m-d') - 从 MySQL 读取 DATETIME 字段后,若需转为带时区的时间对象,建议显式指定:
new DateTime($db_time, new DateTimeZone('Asia/Shanghai')) - 数据库字段类型建议用
DATETIME存本地时间(配合统一时区),或用TIMESTAMP存 UTC 时间(需应用层转换),避免混用











