在数据库迁移文件中,定义了$table->timestamps();, 但是发现字段 created_at 和 updated_at 的时间比北京时间(lumen的.env定义了时区)多了8个小时。
经排查:
对于lumen项目,除了定义APP_TIMEZONE=Asia/Shanghai 还需定义DB_TIMEZONE=+08:00。
参考文章:
http://blog.gxxsite.com/lumen-php-timezone-db-diff-wrong-time-solution/
原文:
早前发现在命令行查看 mysql 数据时,timestamp 字段(比如created_at和updated_at)总是比现实多出 8 个小时。然而由于前端一直没有察觉有问题,所以就以为只是我数据库的 timezone 设置有问题而已。
直到我创建了一个连接于同一数据库的 Laravel 工程,才发现问题的存在,mysql 中所有 timestamp 字段的原始时间(UTC)都比现实多出8小时,而调整 mysql 时区,也只是改变显示而已,数据在 insert 时已经铸成大错。
反复研究了很多,Laravel 并没有把timezone放到.env里设置,看了一遍config/app.php和config/database.php文件,确保时区均设置正确,然后在 Laravel 项目里修改的时间,timestamp 是准确的,没有多出 8 小时。
OK,到这里,问题基本找到了,我在 Lumen 中找到vendor/laravel/lumen-framework/config/database.php配置文件,里面有'timezone' => env('DB_TIMEZONE', '+00:00')这么一句。。。我知道了,Lumen 的 PHP 配置是+8的时区,而 DB 配置是 0 时区,所以保存时,Lumen会主动把时间加 8 小时再保存进数据库。
果然,我在.env文件中添加DB_TIMEZONE=+08:00,Lumen就再也不插入错误的时间了。
官方文档中提到了APP_TIMEZONE,然而并没有提及DB_TIMEZONE,这个坑真的有点大。。。
其他参考连接:
http://bbs.earnp.com/article/355
https://www.laravist.com/blog/post/lumen-set-custom-timezone