strtotime () 的-1month 的问题

在PHP当中我们可以这样获取距离当前时间的每个月的月份,比如说下面的代码是获取当前时间往前的12个月份:

<?php

$i = 12;

while($i >= 1) {
    echo date('Y-m', strtotime('-' . $i . ' month')) . "\n";
    $i--;
}

输出结果:

2017-09
2017-10
2017-11
2017-12
2018-01
2018-02
2018-03
2018-04
2018-05
2018-06
2018-07
2018-08

写博客时是9月3号。

输出的结果没有问题,可以获取到当前之间前面的12个月份。但是下面这个情况就无法输出正确的结果了:

<?php

$i = 12;

while($i >= 1) {
    echo date('Y-m', strtotime('-' . $i . ' month', strtotime('2018-8-31 12:00'))) . "\n";
    $i--;
}

输出结果:

2017-08
2017-10
2017-10
2017-12
2017-12
2018-01
2018-03
2018-03
2018-05
2018-05
2018-07
2018-07

为什么出现这种情况?因为每个月的天数是不一样的,所以如果带上天数的话会出现bug的,特别是在每月的31号。可以用下面的方法解决:

<?php

$i = 12;

while($i >= 1) {
    echo date('Y-m', strtotime('-' . $i . ' month', strtotime('2018-8'))) . "\n";
    $i--;
}

输出结果:

2017-08
2017-09
2017-10
2017-11
2017-12
2018-01
2018-02
2018-03
2018-04
2018-05
2018-06
2018-07

唯一变动的地方是 strtotime('2018-8')

原文地址:《小滕博客》

本作品采用《CC 协议》,转载必须注明作者和本文链接
开源教育系统https://meedu.vip
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!