【问题标题】:Laravel Carbon Invalid Datetime Format Error during DSTDST期间Laravel Carbon无效的日期时间格式错误
【发布时间】:2018-01-10 23:38:24
【问题描述】:

我正在使用 Laravel 5.3,并在 mysql 列中插入 datetime,其中值是使用 Carbon 从控制器生成的。

在特定时间,我的错误日志中有很多错误,如下所示:

Next Illuminate\Database\QueryException: SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '2017-10-01 02:29:54' for column 'invite_at' at row 1 (SQL: insert into `wedding_invitations` (`name`, `email`, `invite_at`, `updated_at`, `created_at`) values (Donald Trump, trump@donald.com, 2017-10-01 02:29:54, 2017-08-02 02:29:54, 2017-08-02 02:29:54)) in /home/myapp/applications/weddingapp/vendor/laravel/framework/src/Illuminate/Database/Connection.php:770

我发现问题不在于日期格式,因为2017-10-01 02:29:54 是有效的 sql 格式。在深入研究并阅读 SO 中的其他答案后,我发现我的服务器时间设置为AEST,我认为错误发生在 10 月 1 日凌晨 2 点至 2.59.59 之间的时间由于日光不存在储蓄。这可能就是我收到此错误的原因。

invite_at 日期是在我的控制器中创建的,如下所示:

$invitationDate = Carbon::now()->addDays(60);

我的问题是:

  1. 如何解决上述问题?因为我不希望它由于 DST 而输入无效日期?我不想仅仅为了解决这个问题而更改 mysql 或服务器中的时区。

  2. 我在想的另一个想法是,当调用addDays 时,可能将时间设置为23.59.59,因为这样可以避免这个错误。对我来说,日期比时间重要。那么如果我想让Carbon中的addDays设置一个固定的时间,我该怎么做呢?

【问题讨论】:

  • 所以您可以将->endOfDay() 添加到addDays() 函数中?
  • 完美!!!发布后不久,我想到了setTime(0,0),但->endOfDay() 似乎很适合我的追求。谢谢你。我现在就试试。
  • 太棒了,它确实有效,正是我想要的。谢谢你。如果您可以将其发布为答案,我很乐意接受并将其标记为已解决。感谢您的支持。

标签: laravel datetime laravel-5.3 dst php-carbon


【解决方案1】:

无论出于何种原因,为了让我做出的评论作为答案:

因为您关心的是日期而不是时间,您可以将您从 Carbon 获得的 date_time 值设置为 startOfDay(),或者如我对 endOfDay() 的评论中所述,即:

$invitationDate = Carbon::now()->addDays(60)->endOfDay();

另一种方法是简单地使用日期作为invited_by 的列类型,然后您可以避免时间问题(因为您说日期更重要)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-13
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2016-12-01
    • 2017-11-08
    • 1970-01-01
    相关资源
    最近更新 更多