PHP函数strtotime使用时发现的问题
项目中经常用到时间筛选功能,这时候用好函数 strtotime 的语义化参数能让你事半功倍。
// 用语义化参数
// 两周后
$time = '+2 week';
// 三天前
$time = '-3 day';
// 七小时前
$time = '-7 hour';
// 五秒前
$time = '-5 second';
// 一个月前
$time = '-1 month';
// 得到对应的时间起点
$时间戳 = strtotime($time)
在一次编写功能时,顺手测试了下结果发现,获取相应的天,时,年等都没有任何问题,但测试月时发现结果比较反常:
// 测试日期时 2019-10-31日
// 列出前12个月的月份
date('m', strtotime('-1 month'));
// 结果是:
10
// 一脸懵逼。。。
通过多方查找资料才知道,原来查询月份的时候,strtotime先对月份值进行增减运算,再将计算时的日期(几号)作为计算后的准确日期,比如当时是10-31,前一个月计算后就是 9-31。因为9-31不是正确日期,所以自动转换成规范时间10-01。
所以打印结果不是我们预想的那样,不过从PHP5.3开始, date新增了一系列修正短语, 来明确这个问题, 那就是”first day of” 和 “last day of”, 也就是你可以限定好不要让date自动”规范化”:
// 正确的姿势
date('m', strtotime('first day of -1 month'));
// 9