因此,在Laravel的app.php中,我设置了以下时区:
'timezone' => 'America/Denver',
在MySQL设置中,我有相同的时区。当我运行select now()
时,会得到当前的丹佛时间。
但是,当我在数据库中的任何表中创建记录时,created_at
字段(默认值设置为CURRENT_TIMESTAMP
)以某种方式比丹佛提前5小时结束。
我认为某种程度上默认为UTC时间,但是我不确定。我发现与此问题相关的所有在线资源都声称在Laravel中设置时区应该可以解决问题。
我还能做些什么来确保我将正确的时区保存在CURRENT_TIMESTAMP
中?
在这件事上,我认为服务器范围的PHP设置不应该优先于MySQL或Laravel中的设置,但是我仍然尝试着将php.ini
中的时区编辑为America / Denver和没运气。以前已将其注释掉(未设置为UTC)。
答案 0 :(得分:1)
使用
SET SESSION time_zone = 'America/Denver';
在原始查询(DB::select(DB::raw("SET SESSION time_zone = 'America/Denver'")
)中进行插入和更新。
测试用例
CREATE TABLE test (
id INT
, created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO test (id) VALUES(1);
SET SESSION time_zone = 'America/Denver';
INSERT INTO test (id) VALUES(2);
可能的结果
| id | created_at |
| --- | ------------------- |
| 1 | 2019-03-04 13:57:31 |
| 2 | 2019-03-04 06:57:31 |
请参阅demo
答案 1 :(得分:0)
Eloquent在为Carbon
设置时间戳时创建了一个新的created_at
对象,它没有使用MySQL的默认值。应该使用Laravel设置的date_default_timezone_set
。
一个明显的答案是:您是否尝试过清除配置缓存?
php artisan config:clear
顺便说一句,通常建议始终在所有内容上使用UTC,并仅在最后可能的时间将其转换为本地时区。
// PS: we recommend you to work with UTC as default timezone and only use
// other timezones (such as the user timezone) on display