PHP获取上个月最后一天的一个容易忽略的问题

时间:2023-12-04 18:25:38

正常来说,PHP是有一个很方便的函数可以获取上个月时间的

strtotime

(PHP 4, PHP 5, PHP 7)

strtotime — 将任何英文文本的日期时间描述解析为 Unix 时间戳

说明 ¶

int strtotime ( string $time [, int $now = time() ] )

今天是2016-10-31日,所以strtotime('-1 month'),应该是9月30日

echo date('Y-m-d',strtotime('-1 month'));

可是实际上,输出的是2016-10-01,不但月份没对,日也没对上。

猜测是9月没有31号,所以直接跑到10月1号了。

所以要尝试另一种写法

echo date('Y-m-d',strtotime('-1 month -1 day'));

输出:2016-09-30

这种写法是不是一定没问题的呢?

我想到还要一个特殊的月份,今年的2月29号,所以要尝试一下在2月的时候会不会出问题。

首先查表得2月29号的时间戳是1456675200

echo date('Y-m-d',1456675200); //2016-02-29
echo PHP_EOL;
echo date('Y-m-d',strtotime('-1 month',1456675200)); //2016-01-29
echo PHP_EOL;
echo date('Y-m-d',strtotime('-1 month -1 day',1456675200)); //2016-01-28

结果是两个都不对了..

所以终级写法是,先获取本月的第一天,再-1天

$time =  strtotime(date('Y-m-01',1456675200));
echo date('Y-m-d',strtotime('-1 day',$time)); //2016-01-31