本来我用的是下面这样的方法
$months = [];
for ($i = 0; $i < 12; $i++) {
$months[] = date('Y-m', strtotime("-$i month"));
}
但是在大多时候是对的,结果今天,12月31日的时候,上面的$months的值就成了下面这样。
[
0 => "2022-12"
1 => "2022-12"
2 => "2022-10"
3 => "2022-10"
4 => "2022-08"
5 => "2022-07"
6 => "2022-07"
7 => "2022-05"
8 => "2022-05"
9 => "2022-03"
10 => "2022-03"
11 => "2022-01"
]
显然是错误的。最后找到原因和解决办法。
这是因为 strtotime(“-$i month”) 的返回值不是恰好每个月的第一天,而是当前时间减去 $i 个月的时间。
例如,假设当前时间是 2022 年 12 月 31 日,则 strtotime(“-$i month”) 返回的时间为 2022 年 12 月 31 日($i=0$ 的情况),2022 年 12 月 31 日($i=1$ 的情况),2022 年 10 月 31 日($i=2$ 的情况),等等。
然后,将这些时间转换为字符串形式后,使用 date(‘Y-m’, …) 将它们转换为月份格式。由于这些时间并不恰好是每个月的第一天,因此最终得到的月份可能会重复。
为了得到当前这个月以及之前的 11 个月的月份,可以使用如下方法:
$months = [];
for ($i = 0; $i < 12; $i++) {
$timestamp = strtotime("first day of -$i month");
$months[] = date('Y-m', $timestamp);
}
这样,$months 数组就会包含当前这个月以及之前的 11 个月的月份,例如:
[
0 => "2022-12"
1 => "2022-11"
2 => "2022-10"
3 => "2022-09"
4 => "2022-08"
5 => "2022-07"
6 => "2022-06"
7 => "2022-05"
8 => "2022-04"
9 => "2022-03"
10 => "2022-02"
11 => "2022-01"
]