添加间隔的DateTime会给出错误的ans

时间:2014-09-16 07:35:12

标签: php datetime strtotime

2当试图通过在strtotime函数中添加+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-03-03

应该遵循预期结果或如何获得以下结果:

2011-01-31
2011-02-28

由于

4 个答案:

答案 0 :(得分:0)

而不是指定month指定date

new DateInterval("P#D")// # no. of days.

或者您可以使用modify。请参阅此处:http://php.net/manual/en/datetime.modify.php

答案 1 :(得分:0)

这有效:

<?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>";
?>

结果:

2011-01-31
2011-02-28

这是一个类似的answer,它解释了为什么你的方式不能提供所需的输出。

DateTime::modify方法

上的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 this文档页面上的Relative Formats评论部分。

答案 2 :(得分:0)

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

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

    请参阅@shamittomar

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

所以只需将P1M替换为P28D即可获得所需的结果

$EndDateline = $StartDateline->add(new DateInterval("P28D"));

See DEMO

答案 3 :(得分:0)

John Robertson已经解释了为什么会得到你得到的结果。输出是正确的,因为当您向31.1.添加+1个月时,它将变为31.2.3 days超过28.2.,因此正确的结果为3.3.

根据您的需要,您需要一个自定义脚本,以及随时随地处理的脚本,例如:

$start = new DateTime('31 January 2011');

$new   = clone $start;
$new->modify('first day of next month'); 
$newDay = ($start->format('j') > $new->format('t') ? $new->format('t') : $start->format('j')) - 1;
$new->modify("+{$newDay} days");

echo $start->format('Y-m-d'), " > ", $new->format('Y-m-d');

demo