为什么 0000-00-00 00:00:00 返回 -0001-11-30 00:00:00?

2022-08-30 23:45:33

在此之前,我已经阅读了这个问题:

如何防止 PHP 将具有 0000-00-00 值的 DateTime 对象转换为 -0001-11-30

但是我不明白为什么当我运行此代码时,0000-00-00 00:00:00 更改为 -0001-11-30 00:00:00:

$date = date_create('0000-00-00 00:00:00');
echo date_format($date, 'Y-m-d H:i:s');

当我尝试使用0001-00-00 00:00:00时,我得到:

0000-11-30 00:00:00

使用0001-01-01 00:00:00,我得到:

0001-01-01 00:00:00

以及 0000-00-01 00:00:00:

-0001-12-01 00:00:00

有什么具体的原因为什么它总是在不存在的日期之前的年/日/月?

date_createdate_format函数是否有问题?

我确实注意到时间以正确的方式显示,这可能是因为时间00:00:00存在。


答案 1

就像@Mark贝克说的那样,这是一个无效的日期,因为没有零月,没有零日。所以它是第1个月(1月)-1(去年12月)和第1-1天(去上个月的最后一天,给出11月30日)。0000-00-00 00:00:00

如果你在date_create中看到足够接近的这种行为。它说将任何数字识别为12作为一个,任何数字到31作为一个;它将结果日期计算为 开始后的天数。这意味着,当创建对象的天数超过该月的天数时,该日期将超过该月的月底。如果您创建的日期无效,这也适用。:)DateTime[month][day][day][month]datetime


答案 2

这是 php 中 DateTime 函数的已知问题。日期时间函数没有正确的错误处理。

其他函数(如 strtotime)确实可以正确处理它。

您可以参考此内容以获取更多参考。


推荐