PHP strtotime函数计算下个月时候的一个坑

我们用php获取下个月的月份的时候通常会想当然

1
echo date('Ym', strtotime('next month'));

平时看来并没有什么问题,但是当今天是1月31号的时候会发生什么呢?

1
2
3
4
5
6
7
8
9
10
11
<?php 
$date = "2018-01-31";

$ym1 = date('Y-m', strtotime('+1 month ' . $date));
$ym2 = date('Y-m', strtotime('+2 month ' . $date));
$ym3 = date('Y-m', strtotime('+3 month ' . $date));

var_dump($date);
var_dump($ym1);
var_dump($ym2);
var_dump($ym3);

我们期待的输出结果可能是

1
2
3
4
string(10) “2018-01-31”
string(7) “2018-02”
string(7) “2018-03”
string(7) “2018-04”

但是输出的结果确是

1
2
3
4
string(10) “2018-01-31”
string(7) “2018-03”
string(7) “2018-03”
string(7) “2018-05”

这到底是怎么会是呢?

原来,strtotime函数将1月31日的1个月以后计算成2月31日,显然,2月没有31日,于是,这个1个月后的时间就变成了相应的3月3日。去掉月份,于是得到了2018-03的结果。

那么要正确获取下个月的日期可以怎么做呢?

其实很简单。先取得这个月的第一天,然后再加上一个月就好了。

1
2
$date = date("Y-m-01");
$ym1 = date('Y-m', strtotime('+1 month ' . $date));
如果你觉得本文对你有帮助,请给我点赞助。