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 协议》,转载必须注明作者和本文链接
开源教育系统 www.meedu.vip
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 1

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