Php 间隔的DateTime加法给出了错误的ans

Php 间隔的DateTime加法给出了错误的ans,php,datetime,strtotime,Php,Datetime,Strtotime,2当试图通过在strotime函数中添加+1 month以及DateTime类来获取下一个月时,如果开始日期时间是2011年1月31日,则无法给出正确答案 <?php $StartDateline = new DateTime("31 January 2011"); echo date('Y-m-d', $StartDateline->getTimestamp()); echo "<br>"; $EndDateline = $StartDateline->add

2当试图通过在strotime函数中添加+1 month以及DateTime类来获取下一个月时,如果开始日期时间是2011年1月31日,则无法给出正确答案

<?php

$StartDateline = new DateTime("31 January 2011");

echo date('Y-m-d', $StartDateline->getTimestamp());
echo "<br>";
$EndDateline = $StartDateline->add(new DateInterval("P1M"));//strtotime("+1 month", $startDateline);

echo date('Y-m-d', $EndDateline->getTimestamp());

echo "<br>";

?>
预期结果应如下所示,或者我应如何获得以下结果:

2011-01-31
2011-02-28
感谢您不用指定月份,而是指定日期

或者您可以使用modify。请参见此处:

此功能:

<?php
    $StartDateline = new DateTime("31 January 2011");
    echo date('Y-m-d', $StartDateline->getTimestamp());
    echo "<br>";

    $test = $StartDateline->modify('last day of next month');
    echo date('Y-m-d', $test->getTimestamp());
    echo "<br>";
?>
下面是一个类似的例子,解释了为什么您的方式没有给出想要的输出

方法上的PHP文档

编辑: 我现在明白了,你不需要下个月的最后一天,而是下个月的同一天。 我发现这段代码有效:

function addMonthsToTime($numMonths = 1, $timeStamp = null){
    $timeStamp === null and $timeStamp = time();//Default to the present
    $newMonthNumDays =  date('d',strtotime('last day of '.$numMonths.' months', $timeStamp));//Number of days in the new month
    $currentDayOfMonth = date('d',$timeStamp);

    if($currentDayOfMonth > $newMonthNumDays){
      $newTimeStamp = strtotime('-'.($currentDayOfMonth - $newMonthNumDays).' days '.$numMonths.' months', $timeStamp);
    } else {
    $newTimeStamp = strtotime($numMonths.' months', $timeStamp);
    }

    return $newTimeStamp;
}

$timestamp = strtotime('2011-01-01');
echo date('m/d/Y', addMonthsToTime(1, $timestamp));
//02/01/2011

$timestamp = strtotime('2011-01-31');
echo date('m/d/Y', addMonthsToTime(1, $timestamp));
//02/28/2011
摘自PHP文档页面的评论部分。

PHP DateTime的当前行为没有错误。真正发生的是

+1个月将原来的月数增加1。这使得日期为2011-03-03。 2011年2月的第二个月只有28天,所以PHP auto通过从2月份开始继续计算天数来纠正此问题 第一。然后在3月3日结束。1月31日+31天1个月=3月3日,因为2月只有28天

要获得预期答案,应使用天数

这就是为什么在报告中说,增加月份时要小心。 所以只要用P28D替换P1M就可以得到想要的结果

$EndDateline = $StartDateline->add(new DateInterval("P28D"));
已经解释了为什么你会得到你得到的结果。输出是正确的,因为将+1个月添加到31.1。它将变成31.2。比28.2.多3天,因此正确的结果为3.3

根据您的需要,您将需要一个自定义脚本,以您的方式处理结转日,例如:

$start=新日期时间'2011年1月31日'; $new=克隆$start; $new->修改“下个月的第一天”; $newDay=$start->format'j'>$new->format't'$新建->格式't':$start->格式'j'-1; $new->modify+{$newDay}天; echo$start->format'Y-m-d',>,$new->format'Y-m-d';
你的意思是2011-02-28吗?你到底为什么期望1个月的时间加上2个月的时间?你的期望结果比应该的时间多25天。我错误地写了2011-03-28,应该是2011-02-28。谢谢@Yunowork因为我一般想增加一个月,我不知道日期是2011年1月31日、1月30日或1月1日。我只想增加一个月,例如:*2011年1月1日应为2011年2月1日,*2011年1月30日或31日应为2011年2月28日,依此类推。我希望它是通用的。@krishna你可以用它来做条件语句好的,通过Datetime方法或StrotTime函数是不可能的吗???@krishna你可以使用P1M,但在二月到来时有一个陷阱。这就是为什么要考虑这一点,在手动示例三中,它表示在添加月份时要小心。因此,使用条件语句检查月份。检查或研究$D- >修改“下个月的第一天”,我想一般,比如30或31,Jun 2011到28月2日2011, 1月2011日,应该到2010FEB2010.如果我的答案是正确的,考虑接受它。如果你的问题改变了,请编辑您上面的问题。@NitsanBaleli:wyh您会混合使用日期函数和日期时间对象吗?谢谢您的回答,这对解决问题很有帮助。
2011-01-31
2011-02-28
function addMonthsToTime($numMonths = 1, $timeStamp = null){
    $timeStamp === null and $timeStamp = time();//Default to the present
    $newMonthNumDays =  date('d',strtotime('last day of '.$numMonths.' months', $timeStamp));//Number of days in the new month
    $currentDayOfMonth = date('d',$timeStamp);

    if($currentDayOfMonth > $newMonthNumDays){
      $newTimeStamp = strtotime('-'.($currentDayOfMonth - $newMonthNumDays).' days '.$numMonths.' months', $timeStamp);
    } else {
    $newTimeStamp = strtotime($numMonths.' months', $timeStamp);
    }

    return $newTimeStamp;
}

$timestamp = strtotime('2011-01-01');
echo date('m/d/Y', addMonthsToTime(1, $timestamp));
//02/01/2011

$timestamp = strtotime('2011-01-31');
echo date('m/d/Y', addMonthsToTime(1, $timestamp));
//02/28/2011
$EndDateline = $StartDateline->add(new DateInterval("P28D"));