需要关于PHP strotime()计算错误的建议吗

需要关于PHP strotime()计算错误的建议吗,php,time,Php,Time,在使用PHP的strotime()函数时,我遇到了一个以前从未遇到过的奇怪问题 $original = strtotime('2015-12-31 12:34:56'); $time = strtotime('+ 2 month', $original); echo date('m/d/y H:i:s', $original),'<br>',date('m/d/y H:i:s', $time); 我实际得到的输出: 12/31/15 12:34:56 02/29/16 12:34:

在使用PHP的strotime()函数时,我遇到了一个以前从未遇到过的奇怪问题

$original = strtotime('2015-12-31 12:34:56');
$time = strtotime('+ 2 month', $original);
echo date('m/d/y H:i:s', $original),'<br>',date('m/d/y H:i:s', $time);
我实际得到的输出:

12/31/15 12:34:56
02/29/16 12:34:56
12/31/15 12:34:56
03/02/16 12:34:56
我如何解释这个计算错误?经过一番调查之后,我意识到PHP平均需要30.5天来进行这样的计算。我真的不太关心这种情况发生的“原因”,而是我能做些什么来解释它。我有一些想法,当涉及月计算时,需要为strotime()编写一个包装器,但这似乎是一个复杂的方法


有一个现有的答案,但是时间成分在问题中没有提到(只有一个日期),因此我不认为这个问题是那个问题的复制品。此外,我主要是寻求改进我们处理此类问题的方式,而不一定是针对上述问题发布的解决方案。但是,如果我这样做是错误的,那么欢迎您删除此问题:(

2月没有31天,因此溢出天数将推到3月。如果您将年份从2015年更改为2014年,您可以检查效果,然后再次执行代码。结果是2015-03-03(2015年2月有28天)

2月没有31天,因此溢出天数将推到3月。如果您将2015年更改为2014年,则可以检查其效果,然后再次执行代码。结果是2015-03-03(2015年2月有28天)

如果您想获得最后日期,可以通过另一种方式使用此溢出/欠流行为:

$original = new DateTime('2015-12-31');
$modified = clone $original;
$modified->modify('+2 months');
$modified->setDate($modified->format('Y'), $modified->format('m'), 0);

echo $original->format('m/d/y H:i:s') . "<br>" .$modified->format('m/d/y H:i:s');

这不是最漂亮的解决方案,但它很有效。

如果你想得到最后一个日期,你可以用另一种方式使用这种上下浮动的行为:

$original = new DateTime('2015-12-31');
$modified = clone $original;
$modified->modify('+2 months');
$modified->setDate($modified->format('Y'), $modified->format('m'), 0);

echo $original->format('m/d/y H:i:s') . "<br>" .$modified->format('m/d/y H:i:s');

这不是最漂亮的解决方案,但它很有效。

因为一个月不是固定长度……PHP不会给你“两个月后的最后一天”,它需要一个任意的月长,在大多数(但不是所有)情况下都有效情况……如果你想这样做,在每月的第一天加上2个月,然后请求该月的最后一天,因为一个月不是固定的长度……PHP不会给你“两个月后的最后一天”,它需要一个任意的月长,在大多数情况下(但不是所有情况下)都有效情况……如果你想这样做,在每月的第一天加上2个月,然后请求该月的最后一天。如果听起来不礼貌,那么抱歉,但我们不是你的个人编码大军,因此如果你收到一个有效的解决方案,接受它并自己改进它。日期计算在PHP中有点混乱,因此没有一个简单的解决方案问题:如果这听起来很粗鲁,很抱歉,但我们不是您的个人编码大军,因此如果您收到一个有效的解决方案,请接受它并自行改进。PHP中的日期计算有点混乱,因此没有简单的解决方案: