【发布时间】:2019-07-31 17:16:04
【问题描述】:
我正在使用队列工作者开发一个 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)
需要注意的几点:
- 时间戳似乎格式正确
- 该列是 MySQL TIMESTAMP 类型(可为空),使用 InnoDB
-
updated_at字段由 Laravel 默认管理,没有任何自定义日期格式发生 - 我没有使用任何日期修改器,也没有使用任何会在保存之前更改值的东西
- 此代码已经运行了数周,没有任何问题
- 最近没有更改代码
- 我执行了
git checkout .和composer install以确保没有任何库文件已更改或以某种方式损坏(没有更改) - 错误首次出现在
2019-03-10 02:00:39(UTC),即当地时间晚上 8 点(中部时间)
明尼苏达州 2019 年夏令时将于凌晨 2:00 开始 3 月 10 日星期日
-- 谷歌
我可以在谷歌上找到的所有内容都与使用明显错误的时间格式的人有关,所以这并没有帮助我弄清楚。
我觉得在夏令时应该在美国中部时间 02:00 开始的同一天 UTC 02:00 开始的错误之间有太多的巧合,但我不知道为什么当时间戳由框架管理并在保存之前转换为 UTC 时会引发此错误(并且 UTC 不会因夏令时而改变)。
MySQL 5.5.45
Laravel 5.7.28
nesbot/碳 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)管理时,我该怎么做才能防止这种情况发生?
【问题讨论】:
-
您应该编辑您的previous question 而不是发布新的。您在此网站上拥有多个用户名吗?
-
嗨蒂姆,感谢您抽出宝贵时间回复!但是,我没有发布这个问题。
-
另外,您的错误消息似乎来自 SQL Server,而不是 MySQL。
-
@TimBiegeleisen 这是来自 Laravel 的
Illuminate\Database\QueryException,我可以向您保证,它是问题中所述的 MySQL 5.5.45。我认为包含完整的堆栈跟踪不会有太大帮助,因为异常是由我显示的数据库错误引发的。 -
如果 MySQL 有某种严重的 DST 错误现在才出现,那将会非常“有趣”。