Laravel SQLSTATE [22007]:无效的日期时间格式:1292错误的日期时间值:“ updated_at”列的“ 2019-03-10 02:00:39”(夏令时?)

时间:2019-03-10 03:13:47

标签: mysql laravel

我正在使用一个队列工作器来处理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) 

一些注意事项:

  • 时间戳出现为正确的格式
  • 该列是使用InnoDB的MySQL TIMESTAMP类型(可空)
  • updated_at字段由Laravel默认值管理,日期格式未自定义
  • 我没有使用任何日期转换器,也没有使用任何会在保存之前更改值的东西
  • 此代码已经运行了数周,没有任何问题
  • 最近没有代码更改
  • 我做了git checkout .composer install,以确保所有库文件均未更改或损坏(未更改)
  • 该错误首先在当地时间(中部时间)晚上8点2019-03-10 02:00:39(UTC)出现
  

明尼苏达州的夏令时2019将在凌晨2:00开始   3月10日,星期日

     

-Google

我在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)管理时,我该怎么办?

1 个答案:

答案 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'
],