配置MySQL EST时区后插入时间仍异常,寻求解决方案
问题解决思路
核心原因
你用PHP的date("Y-m-d H:i:s")生成的时间,完全由PHP自身的时区设置决定,和MySQL的default-time-zone配置没有关系。所以只改MySQL的my.ini,不会影响PHP生成的时间值。另外注意你代码里的prpare是拼写错误,要改成prepare,否则脚本会报错。
解决方法
方法1:在PHP代码中临时设置时区
在调用date()函数前添加时区设置代码,指定为美国东部时间对应的PHP时区标识:
// 设置为EST对应的时区 date_default_timezone_set('America/New_York'); // 修正拼写错误后的插入代码 $stmt = $pdo->prepare("INSERT INTO `table`(`name`,`branch`,`startDate`) VALUES ( :name, :branch, :date) "); $stmt->execute(["name" => $_POST["name"], "branch" => $_POST["branch"], "date" => date("Y-m-d H:i:s")]);
方法2:修改PHP配置文件永久生效
找到XAMPP目录下的php/php.ini文件,找到date.timezone配置项,修改为:
date.timezone = America/New_York
保存后重启XAMPP的Apache服务,所有PHP脚本都会默认使用这个时区。
方法3:让MySQL自动生成时间(更推荐)
既然已经配置了MySQL的EST时区,直接让MySQL处理时间生成能避免时区不一致问题:
- 将表的
startDate字段类型设为DATETIME,并设置默认值为CURRENT_TIMESTAMP - 修改PHP代码,不用传递PHP生成的时间,让MySQL自动填充:
$stmt = $pdo->prepare("INSERT INTO `table`(`name`,`branch`) VALUES ( :name, :branch) "); $stmt->execute(["name" => $_POST["name"], "branch" => $_POST["branch"]]); // 或者手动调用MySQL的时间函数 $stmt = $pdo->prepare("INSERT INTO `table`(`name`,`branch`,`startDate`) VALUES ( :name, :branch, NOW()) "); $stmt->execute(["name" => $_POST["name"], "branch" => $_POST["branch"]]);
验证时区是否生效
- PHP端验证:执行
echo date_default_timezone_get();,确认输出为America/New_York - MySQL端验证:登录MySQL后执行
SELECT @@global.time_zone, @@session.time_zone;,确认返回值为-05:00
内容的提问来源于stack exchange,提问作者Self_taught_codes
相关产品推荐
相关产品推荐

