PHP 相对月份未产生预期结果


PHP relative month not producing expected result

所以,我正在减去相对月份。根据文档:

相对月份值是根据它们经过的月份长度计算的。例如"+2 month 2011-11-30",这将产生"2012-01-30"。这是由于 11 月的长度为 30 天,12 月的长度为 31 天,总共产生 61 天。

我理解为什么添加月份时的示例,但我不明白为什么2014-12-31 -1 month会产生2014-12-01.12月的31天,结果不应该是11月的最后一天吗?

示例代码。函数 1 产生我从函数 2 和函数 3 中期望的结果。

//Func 1
$date = '2014-12-31 23:59:59'; //YYYY-MM-DD
$days = 0;
echo $date.'<br>';
for ($i = 1; $i < 13; $i++) {
    $days += cal_days_in_month(CAL_GREGORIAN, (13-$i), 2014);
    echo date("Y-m-d H:i:s", strtotime("-$days days", strtotime($date))).'<br>';
}
echo "<br><br>";
//Func 2
$date = '2014-12-31 23:59:59'; //YYYY-MM-DD
echo $date.'<br>';
for ($i = 1; $i < 13; $i++) {
    echo date("Y-m-d H:i:s", strtotime("-$i months", strtotime($date))).'<br>';
}
//Func 3
echo "<br><br>";
$dateObj = new DateTime("2014-12-31 23:59:59");
echo $dateObj->format("Y-m-d H:i:s").'<br>';
$dateIntervalObj = new DateInterval("P1M");
for ($i = 0; $i < 12; $i++) {
    echo $dateObj->format("Y-m-d H:i:s").'<br>';
    $dateObj->sub($dateIntervalObj);
}

结果:

2014-12-31 23:59:59
2014-11-30 23:59:59
2014-10-31 23:59:59
2014-09-30 23:59:59
2014-08-31 23:59:59
2014-07-31 23:59:59
2014-06-30 23:59:59
2014-05-31 23:59:59
2014-04-30 23:59:59
2014-03-31 23:59:59
2014-02-28 23:59:59
2014-01-31 23:59:59
2013-12-31 23:59:59

2014-12-31 23:59:59
2014-12-01 23:59:59
2014-10-31 23:59:59
2014-10-01 23:59:59
2014-08-31 23:59:59
2014-07-31 23:59:59
2014-07-01 23:59:59
2014-05-31 23:59:59
2014-05-01 23:59:59
2014-03-31 23:59:59
2014-03-03 23:59:59
2014-01-31 23:59:59
2013-12-31 23:59:59

2014-12-31 23:59:59
2014-12-31 23:59:59
2014-12-01 23:59:59
2014-11-01 23:59:59
2014-10-01 23:59:59
2014-09-01 23:59:59
2014-08-01 23:59:59
2014-07-01 23:59:59
2014-06-01 23:59:59
2014-05-01 23:59:59
2014-04-01 23:59:59
2014-03-01 23:59:59
2014-02-01 23:59:59

似乎总是四舍五入:

2014-10-31 +1 month => 2014-12-01    // this makes sense
2014-12-31 -1 month => 2014-12-01    // this doesn't

在这两种情况下,如果日期不存在,则使用后一天。