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
由于
答案 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,它解释了为什么你的方式不能提供所需的输出。
上的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的当前行为没有错。真正发生的是
2011年第二个月(二月)只有28天,所以PHP 通过继续计算2月份的天数来自动更正此问题 1。然后你在3月3日结束。 1月31日+ 31天(1个月)= 3月3日(因为2月份只有28天)
请参阅@shamittomar
要获得预期答案,您应该使用天数
所以只需将P1M
替换为P28D
即可获得所需的结果
$EndDateline = $StartDateline->add(new DateInterval("P28D"));
答案 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');