【发布时间】: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的合理用例?