所以我循环使用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'));
}
答案 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/>';
}