我正在使用一个队列工作器来处理Laravel应用程序,它刚开始失败并向日志中抛出恒定的异常流。这是其中之一:
SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '2019-03-10 02:00:39' for column 'updated_at' at row 1 (SQL: update `videos` set `updated_at` = 2019-03-10 02:00:39 where `id` = 30860)
一些注意事项:
updated_at
字段由Laravel默认值管理,日期格式未自定义git checkout .
和composer install
,以确保所有库文件均未更改或损坏(未更改)2019-03-10 02:00:39
(UTC)出现 明尼苏达州的夏令时2019将在凌晨2:00开始 3月10日,星期日
我在Google上能找到的所有东西都与使用明显错误的时间格式的人有关,所以这并没有帮助我弄清楚。
我觉得应该从夏令时开始,在世界标准时间02:00开始的错误之间有太多的重合,但是我不知道为什么在时间戳记时会引发此错误由框架管理并转换为UTC(没有夏令时)。
MySQL 5.5.45
Laravel 5.7.28
nesbot / carbon 1.36.2
PHP 7.2.7
config / database.php:
'mysql' => [
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
什么可能导致日期值被识别为无效?
编辑:我确定这绝对是夏令时错误,因为时钟向前跳1小时,02:00至03:00之间的时间无效。我不明白的是为什么设置为UTC的应用程序上的TIMESTAMP字段会引发错误?夏时制如何影响UTC?当时间戳由框架(Laravel + Carbon)管理时,我该怎么办?
答案 0 :(得分:3)
我认为这是因为我的MySQL time_zone
设置设置为SYSTEM
(而且我的系统是美国中央系统),所以实际上仍然假定Laravel提供的UTC时间戳在我的由数据库提供本地时间,并由MySQL内部再次 转换为 real UTC unix时间戳表示,即使它们在每个查询中似乎已经是UTC(我也知道) )。
因此,在当地时间20:00:39(8PM),我的“ UTC”时间戳是02:00:39。 MySQL假设这些时间为美国中部时间,并且由于它位于美国中部的时钟向前跳时的02:00到03:00之间,因此该时间无效。
我认为 Laravel应用程序的正确解决方案是强制每个连接在会话中使用+00:00
时区(或config/app.php
中的任何内容),因此不是二级转换,可以在config/database.php
中完成,例如:
'mysql' => [
// ...
'timezone' => '+00:00'
],