Laravel-时区在DB关闭时节省了5个小时

时间:2019-03-04 13:41:58

标签: mysql laravel

因此,在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)。

2 个答案:

答案 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,并仅在最后可能的时间将其转换为本地时区。

From Carbon

// PS: we recommend you to work with UTC as default timezone and only use
// other timezones (such as the user timezone) on display