Php 间隔的DateTime加法给出了错误的ans
2当试图通过在strotime函数中添加+1 month以及DateTime类来获取下一个月时,如果开始日期时间是2011年1月31日,则无法给出正确答案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
<?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"));