【问题标题】:PHP Carbon & MySQL inserting 9999-31-12 into table ends up as 0000-00-00将 9999-31-12 插入表中的 PHP Carbon 和 MySQL 最终为 0000-00-00
【发布时间】:2016-08-24 15:22:04
【问题描述】:

我正在使用 Carbon 在我的 PHP7 / Laravel 5.2 / MySql 5.7 项目中处理我的日期。

我正在尝试将日期 9999-12-31 23:59:59 插入时间戳字段,但插入时解析为全零。

我的迁移会像这样创建列:

$table->timestamp('end_date');

我的代码生成日期如下:

$endDate = Carbon::create(9999, 12, 31, 23, 59, 59);

然后我将它插入到表格中,如下所示:

 ClientSubscription::create([
     'end_date' => $endDate,
 ])->save();

我可以看到(通过迁移期间的屏幕转储)日期作为 Carbon 实例正确生成,如下所示:

ED= : {
    "date": "9999-12-31 23:59:59.000000",
    "timezone_type": 3,
    "timezone": "UTC"
}

然而,我的表的查询结果是:

0000-00-00 00:00:00

我小心不要在插入 Carbon 之前删除此日期,因此我会在生成此日期后立即复制它,然后使用该副本来计算周期等。

所有其他计算日期(与此日期不同)使用相同的创建例程将 OK 插入到字段中。

我错过了什么?谢谢!

【问题讨论】:

  • 你有一个时区,它可能被推送到10000-01-01 02:59:59,超出了有效范围,导致mysql被全零替换。
  • 嘿@Marc B 太棒了,这很有意义!我的服务器设置为 UTC。如何告诉插入例程忽略 TZ?
  • 该列是 DATETIME 还是 TIMESTAMP? DATETIME 最多可以接受 '9999-12-31 23:59:59.999999',而 TIMESTAMP 只能到 '2038-01-19 03:14:07.999999'
  • 我的问题是你为什么要提前存储一些东西?
  • 我希望这个日期是可用的最大日期,如“无结束订阅” ...那么为什么不允许该字段为 NULL 并使用它没有过期?你基本上是在说“我不知道什么时候到期”......这似乎是NULL的合理用例?

标签: php mysql date


【解决方案1】:

我正在使用@CD001 的建议并将日期设置为空。

我现在的迁移是:

$table->timestamp('end_date')->nullable();

然后不要像这样检查 9999 日期:

if($endDate->year == 9999) {

我这样检查:

if(! $endDate) {

这行得通。谢谢@CD001!

【讨论】:

  • 这非常好,因为year = 9999 不是支票,而是作业。使用“神奇”值会导致all kinds of problems。尽可能避免这种情况。如果订阅没有结束,那么NULL 就是您想要的值。
猜你喜欢
  • 2020-11-11
  • 2013-06-09
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多