+-
mysql – Laravel SQLSTATE [22007]:无效的日期时间格式:1292日期时间值不正确:’2019-03-10 02:00:39’列’updated_at'(夏令时?)
我正在使用队列工作程序处理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安装以确保没有任何库文件发生更改或损坏(无更改)
>错误首先出现在2019-03-10 02:00:39(UTC),即当地时间中部时间晚上8点

Daylight saving time 2019 in Minnesota will begin at 2:00 AM on
Sunday, March 10

— Google

我在谷歌上找到的所有东西都与使用明显错误的时间格式的人有关,所以这并没有帮助我解决这个问题.

我觉得在夏令时应该开始的那天02:00开始的错误之间有太多的巧合,但是我不知道为什么当时间戳由…管理时它会抛出这个错误框架并转换为UTC(没有夏令时).

MySQL 5.5.45
Laravel 5.7.28
nesbot / carbon 1.36.2
PHP 7.2.7

配置/ database.php中:

'mysql' => [

    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
    'strict' => true,
    'engine' => null,
],

什么可能导致日期值被识别为无效?

编辑:我已经确定这绝对是夏令时错误,因为时钟向前跳过1小时,在02:00到03:00之间的时间无效.我不明白为什么设置为UTC的应用程序上的TIMESTAMP字段会抛出错误? UTC如何受到夏令时的影响,当框架(Laravel Carbon)管理时间戳时,我该怎么做才能防止这种情况发生?

最佳答案
我认为正在发生的事情是因为我的MySQL time_zone设置被设置为SYSTEM(我的系统是US Central),Laravel提供的UTC时间戳实际上仍被假定为数据库的本地时间,并在内部再次转换通过MySQL到一个真正的UTC unix时间戳表示,即使它们在每个查询中看起来都是UTC(我知道对了).

因此,在当地时间20:00(晚上8点)我的“UTC”时间戳是02:00:39. MySQL假设这些时间是在中部时间,并且因为当时钟向美国中部跳过时间在02:00和03:00之间,时间无效.

我认为Laravel应用程序的正确解决方案是强制每个连接使用00:00时区进行会话(或者在config / app.php中使用的任何内容),这样就不会发生二次转换,这可以在config / database.php是这样的:

'mysql' => [
    // ...

    'timezone'  => '+00:00'
],
点击查看更多相关文章

转载注明原文:mysql – Laravel SQLSTATE [22007]:无效的日期时间格式:1292日期时间值不正确:’2019-03-10 02:00:39’列’updated_at'(夏令时?) - 乐贴网