CodeIgniter 4中如何将MySQL时区设置为与PHP一致(IST)
解决CodeIgniter v4中updated_at字段时区不一致问题
问题根源
你手动设置的created_at和last_active_on依赖PHP的date()函数,由于PHP时区已设为IST,所以这两个字段时区正确;而updated_at是CodeIgniter自动维护的时间戳字段,它调用数据库的当前时间(如CURRENT_TIMESTAMP),若数据库时区仍为UTC,就会导致该字段与其他字段时区不一致。
正确解决方案(无需修改框架核心文件)
方案1:全局数据库连接时区配置(推荐)
在app/Config/Database.php中找到对应数据库的配置数组(如$default),添加初始化命令设置MySQL时区:
- 若使用PDO驱动:
public $default = [ 'DSN' => '', 'hostname' => 'localhost', 'username' => 'root', 'password' => '', 'database' => 'your_db', 'DBDriver' => 'PDO', 'DBPrefix' => '', 'pConnect' => false, 'DBDebug' => (ENVIRONMENT !== 'production'), 'cacheOn' => false, 'cacheDir' => '', 'charset' => 'utf8', 'DBCollat' => 'utf8_general_ci', 'swapPre' => '', 'encrypt' => false, 'compress' => false, 'strictOn' => false, 'failover' => [], 'port' => 3306, // 新增时区配置 'options' => [ PDO::MYSQL_ATTR_INIT_COMMAND => "SET time_zone='+05:30'" ] ];
- 若使用MySQLi驱动:
public $default = [ // 其他原有配置项... 'initCommands' => [ "SET time_zone='+05:30'" ] ];
方案2:仅在特定Model中设置时区
如果只想让Activity模型对应的数据库操作使用IST时区,可在自定义的Activity模型中添加构造函数:
<?php namespace App\Models; use CodeIgniter\Model; class Activity extends Model { protected $table = 'activity'; protected $primaryKey = 'id'; protected $useTimestamps = true; protected $createdField = 'created_at'; protected $updatedField = 'updated_at'; public function __construct() { parent::__construct(); // 为当前模型的数据库连接设置IST时区 $this->db->query("SET time_zone='+05:30'"); } }
验证说明
配置完成后重新执行更新操作,updated_at字段会自动使用IST时区,与其他字段保持一致。以上方式均不会修改框架核心文件,避免了框架更新时配置被覆盖的问题。
内容的提问来源于stack exchange,提问作者Alaksandar Jesus Gene
相关产品推荐
相关产品推荐

