Laravel Factory 错误的日期时间值

esk*_*imo 1 laravel

在 Laravel 工厂中我有:

'created_at' => now()->subDays(mt_rand(1,90))->subHours(mt_rand(1,23))->toDateTimeString()
Run Code Online (Sandbox Code Playgroud)

这以前工作得很好,我认为它是在 Laravel 7.2 上。我所说的“工作正常”是指我运行它来插入 10.000 行或更多行,并且从未失败。更新到 7.10.3 后,我现在收到以下错误:

SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '2020-03-29 02:10:11' for column 'created_at'
Run Code Online (Sandbox Code Playgroud)

它实际上在失败之前插入了几百行,因此它似乎是失败的特定日期或时间。在实际插入的行中,有些行的日期也为 2020-03-29,有些行的时间为 02:10:11,所以我不知道为什么这是“无效格式”。

pat*_*cus 5

2020 年 3 月 29 日是欧洲夏令时 (DST) 开始的时间。我假设您位于中欧时间 (CET) 时区,时间从凌晨 2 点向前移动 1 小时到凌晨 3 点,因此没有凌晨 2:10,这使得您的日期时间无效。

您有几个选择:

  1. 您可以更新数据库/数据库服务器以使用 UTC。
  2. 您可以更新 Laravel 应用程序时区以匹配数据库服务器时区(app.timezone配置键)。
  3. 您可以更新工厂以setTimezone(/* db timezone */)在将 Carbon 实例转换为字符串之前调用它(这将确保 Carbon 不会为数据库时区创建无效的日期时间)。