在循环日期PHP时出现奇怪的情况

时间:2014-10-29 21:40:38

标签: php for-loop

所以我循环使用for来列出使用此

的当前回溯11个月的月份
$dateFormat = 'Y-m';
$currentMonth = date($dateFormat);
$monthsToGoBack = 11;   
$months = array($currentMonth);

for($m = 1;$m<=$monthsToGoBack;$m++){
    $months[] = date($dateFormat, strtotime("-".$m." Months"));
    echo $m.'<br>';
}

当我运行脚本时发生了最奇怪的事情这就是数组的构建方式,没有2月但3月份是双倍的。有没有人知道造成这种情况的原因。

    Array
(
    [0] => 2014-10
    [1] => 2014-09
    [2] => 2014-08
    [3] => 2014-07
    [4] => 2014-06
    [5] => 2014-05
    [6] => 2014-04
    [7] => 2014-03
    [8] => 2014-03
    [9] => 2014-01
    [10] => 2013-12
    [11] => 2013-11
)

回答问题

for($m = 1;$m<=$monthsToGoBack;$m++){
    $months[] = date($dateFormat,strtotime(date('Y-m') . '-01 -'.$m.' months'));
}

2 个答案:

答案 0 :(得分:1)

这是因为您减去一个月内的秒数。这是不可行的,因为每个月没有固定的秒数。

您需要重写代码。这是一个经过测试的例子:

$currentYear    = date('Y');
$currentMonth   = date('m');
$monthsToGoBack = 11;

for($monthNo = 0;$monthNo <= $monthsToGoBack;$monthNo++)
{
  $months[] = $currentYear.'-'.str_pad($currentMonth,2,'0',STR_PAD_LEFT);
  $currentMonth--;
  if ($currentMonth == 0)
  {
    $currentYear--;
    $currentMonth = 12;
  }
}

echo '<pre>'.print_r($months,TRUE).'</pre>';

输出结果为:

Array
(
    [0] => 2014-10
    [1] => 2014-09
    [2] => 2014-08
    [3] => 2014-07
    [4] => 2014-06
    [5] => 2014-05
    [6] => 2014-04
    [7] => 2014-03
    [8] => 2014-02
    [9] => 2014-01
    [10] => 2013-12
    [11] => 2013-11
)

答案 1 :(得分:0)

我猜这与今天有关,今年是29日和2月只有28天。看起来你试图迭代几个月 - 我强烈建议尝试更强大的API,而不是依靠strtotime。看一下DateTime类及其DateInterval对应类,它允许您非常轻松地进行日历算术运算,并且可能以更安全的方式进行。

例如,像(我没有测试过这个):

$d = new DateTime();
$days = $d->format('d') - 1; // days to 1st of the month
$d->sub(new DateInterval("P{$days}D"));

$dateFormat = 'Y-m';
$monthsToGoBack = 11;
$months = array($d->format($dateFormat));

for($m = 1; $m <= $monthsToGoBack; $m++){
    $d->sub(new DateInterval("P1M"));
    $months[] = $d->format($dateFormat);
    echo $m . '<br/>';
}