PHP的date函数以及strtotime函数是很强大的。基本上围绕这2个函数就能处理绝大多数日常开发中日期的处理。
假设有一个需求是按周,月获取最近7周和最近7月的查询。那么我们肯定要划分出时间区间。
#先按月划分,获取上个月
我们一开始肯定想到这多简单啊
echo date("Y-m-01",strtotime('-1 months'));
但是有没有想过如果是发生在7月的31号(写这篇随笔是8月份)结果是如何。
echo date("Y-m-01",strtotime('-1 months',strtotime('2018-07-31')));
结果是2018-07-01 这不是当月吗?这个就是问题的关键,-1 months只会-30天而已。
最终的方法应该是
echo date("Y-m-01",strtotime(date('Y-m-1').' -1 months'));//这里是表示在当月第一天进行减,这样就避免了31号的情况
#然后我们按周获取,这里周统计可能会出现的坑就是 date('w')为周日的时候是为0.
$testDate = '2018-08-12'; while ($num>0){ //判断当前的天数 $weekdays = date('w',strtotime($testDate))==0?6:date('w',strtotime($testDate))-1; //这里还要递增 $weekdays += 7*(7-$num); $startTime = date('Y-m-d',strtotime('-'.$weekdays.' days',strtotime($testDate))); echo $startTime.PHP_EOL; $num--; }
#整理后的函数,可直接使用
<?php $num = 7; $testDate = '2018-08-12'; print_r(getWeeks($testDate,$num)); print_r(getMonths($testDate,$num)); function getWeeks($date,$num=7){ $weekdaysArr = []; while ($num>0){ //判断当前的天数 $weekdays = date('w',strtotime($date))==0?6:date('w',strtotime($date))-1; //这里还要递增 $weekdays += 7*(7-$num); $startTime = date('Y-m-d',strtotime('-'.$weekdays.' days',strtotime($date))); $weekdaysArr[]= $startTime; $num--; } return $weekdaysArr; } function getMonths($date,$num=7){ $monthsArr = []; while ($num>0){ $startTime = date("Y-m-01",strtotime(date('Y-m-1',strtotime($date)).' -'.(7-$num).' months')); $monthsArr[]= $startTime; $num--; } return $monthsArr; }