Laravel 5.5更新含2018-03-25时间时报错:Incorrect datetime value
问题成因分析
嘿,这个问题我之前处理过类似的情况,核心原因是夏令时(DST)切换导致的无效时间点,结合你的场景具体拆解如下:
时间点本身在对应时区不存在
2018年3月25日是欧盟及欧洲多数国家的夏令时切换日:当地时间凌晨2:00会被直接拨快1小时到3:00,也就是说2018-03-25 02:00:00 至 02:59:59 这个时间段在当地时区中是完全不存在的。
你报错的是2018-03-25 03:00:00,大概率是时区转换冲突导致的:- 如果你的Laravel应用用的是实行夏令时的时区(比如
Europe/Paris、Europe/London),而MySQL服务器用的是UTC或其他非夏令时时区,当应用把本地时间转成数据库时区时,夏令时的切换规则会让这个时间被判定为无效。 - 反过来,如果数据库时区是夏令时时区,而应用生成时间时没正确适配切换规则,也会触发这个错误。
- 如果你的Laravel应用用的是实行夏令时的时区(比如
MySQL Timestamp类型的严格校验
你的done_date字段是timestamp类型,MySQL对这个类型的时间处理有严格的有效性校验:- 存储时会把时间转成UTC时间保存
- 读取时再转回数据库当前时区的时间
一旦传入的时间在数据库对应的时区里是不存在的(比如夏令时跳过的时间段),MySQL就会直接抛出Incorrect datetime value的错误。
额外排查小细节
从报错的SQL里能看到done_date = 2018-03-25 03:00:00,这个时间值没有被单引号包裹。虽然Laravel的查询构建器通常会自动给字符串参数加引号,但如果你的代码里是用原生表达式或者手动拼接的SQL,MySQL会把它解析成数学运算(2018-3-25=1990,再拼接后面的时间部分),最终生成无效的datetime值。不过你说其他时间更新正常,这个可能性相对低,但可以检查下处理done_date的代码逻辑有没有手动拼SQL的情况。
内容的提问来源于stack exchange,提问作者Apeli
相关产品推荐
相关产品推荐

