关于日期:php – 用于每年每个月的循环

php - for loop for each month of year

我想要一个检查当前月份、未来12个月和过去4个月的循环。

例如:今天是8月1日。我的循环应该经过4月、5月、6月、7月、8月、9月、10月、11月、12月、1月、2月、3月、4月、5月、6月、7月和8月。

我试过频闪,但我不知道我怎么能在4个月前和12个月后循环。

这是我的代码

1
2
3
4
5
6
7
8
9
10
$i = 1;
$month = strtotime('2013-08-01');

    while($i <= 12) {
        $month_name = date('F', $month);
        echo $month_name;
        echo"";

        $month = strtotime('+1 month', $month);
        $i++;


我认为Yoshi已经准备好回答了,但是在datetime中使用datetiperiod更为一致,并且使代码imho可读性更强:

1
2
3
4
5
6
7
8
$oneMonth = new \DateInterval('P1M');
$startDate = \DateTime::createFromFormat('d H:i:s', '1 00:00:00')->sub(new \DateInterval('P4M'));
$period = new \DatePeriod($startDate, $oneMonth, 16);

foreach($period as $date){
    //$date is an instance of \DateTime. I'm just var_dumping it for illustration
    var_dump($date);
}

看到它工作


这可能很棘手,我将这样做:

1
2
3
4
5
6
7
8
9
10
11
12
$month = date("n","2013-08-01") - 1; // -1 to get 0-11 so we can do modulo

// since you want to go back 4 you can't just do $month - 4, use module trick:
$start_month = $month + 8 % 12;
// +8 % 12 is the same is -4 but without negative value issues
// 2 gives you: 2+8%12 = 10 and not -2

for ($i = 0; $i < 16; $i += 1) {
    $cur_month = ($start_month + $i) % 12 + 1; // +1 to get 1-12 range back
    $month_name = date('F Y', strtotime($cur_month ." months"));
    var_dump(month_name);
}


你的代码,只是稍微修改了一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
date_default_timezone_set('UTC');

$i = 1;
$month = strtotime('-4 month');

while($i <= 16) {
    $month_name = date('F', $month);
    echo $month_name;
    echo"";

    $month = strtotime('+1 month', $month);
    $i++;
}

最简单的解决方案:

1
2
3
4
for($i=-4; $i<=12; $i++) {
    echo date("F",strtotime( ($i > 0) ?"+$i months" :"$i months") )."
"
;
}

说明:

循环从-4开始一直到12(总共17个,包括0个)。strtotime()中的三元语句只检查$i是否为正,如果为正,则插入+,以便我们得到strtotime("+1 months")和类似的结果。

塔达!


像这样?:

1
2
3
4
5
6
7
8
$start = -4;
$end = 12;

for($i=$start; $i<=$end;$i++) {
    $month_name = date('F Y', strtotime("$i months"));
    echo $month_name;
    echo"";
}

使用日期时间是最简单和更易读的方法。我会这样做:

1
2
3
4
5
$from = new DateTime('-4 month');
$to   = new DateTime('+12 month');
while($from < $to){
  echo $from->modify('+1 month')->format('F');
}