据我所知,这个问题的范围非常有限,因此最好测试一种类型的错误并修复它。
您要做的是确保在 29 日、30 日或 31 日等较晚的日期上添加“一个月”不会将您推到下个月的 1 日、2 日或 3 日。
date_modify() 的工作方式(将其用于示例日期 \'2012-01-31\',并带有类似 \'+1 months\' 的字符串)是,它首先将月份数增加 1,然后从该月份的开始处查找第 31 天。这就是它溢出到 3 月 3 日的原因。
如果这不是您想要的,您所要做的就是再次使用 date_modify(),现在告诉它回溯几天(本例中为 3 天)。由于您只想回到上个月的最后一天,因此您想要回溯的天数始终与错误日期中的日期相同。
剩下的就是确保不要在不需要时应用此修正,例如当 PHP 将来改进时。这相对容易,因为可能出现问题的情况范围非常有限。
-
(1)此问题仅在 向日期 29、30 或 31
-
(2)当问题发生时,得到的日期总是1、2或3。
下面的代码添加了“+1 个月”,检查这是否导致月份中的日期从高位大幅变化到低位,如果是的话,则调整日期。
//Create the date, store its day-of-month, and add X months
$myDateTimeISO = "2012-01-31";
$addThese = 1;
$myDateTime = new DateTime($myDateTimeISO);
$myDayOfMonth = date_format($myDateTime,'j');
date_modify($myDateTime,"+$addThese months");
//Find out if the day-of-month has dropped
$myNewDayOfMonth = date_format($myDateTime,'j');
if ($myDayOfMonth > 28 && $myNewDayOfMonth < 4){
//If so, fix by going back the number of days that have spilled over
date_modify($myDateTime,"-$myNewDayOfMonth days");
}
echo date_format($myDateTime,"Y-m-d");
结果是:2012-02-29(是的,这是闰年)。
PS:如果您想添加年份,问题和症状几乎相同。同样,您只需要检查结果中的日期是否为 1/2/3,而输入的日期是否为 29/30/31。如果是这样,您需要使用 date_modify 返回 \'-X 天\',其中 X 是结果中的日期。