做明细流水统计经常会遇到一些构建一周日期或一个月日期,主要实现方式就是获取到周或月的最后一个日期,然后循环构建数据结构:

$year = '2021';
$month = '8';
$month = $month < 10 ? '0' . $month : $month;
$data = [];
for ($i = 1; $i <= $lastday; $i++) {
    $d = $d < 10 ? '0' . $d : $d;
    $data['date'] = $year . '-' . $month . '-' . $d;
}

这里以月份为例,$lastday 最后一天是主要需要解决的问题。

网上找到一个版本的:

$lastday = date('j', mktime(0, 0, 1, ($month==12?1:$month+1), 1, ($month==12?$year+1:year))-24*3600)

'j' 表示 number 类型的天,后面用 mktime 创建当月最后一天的时间。直接创建最后一天时间仍然比较困难,所以先是构建一个下月第一天时间,然后时间戳减去一天时间,就可以得到当月最后一天的时间。

Laravel 获取当月的第一天和最后一天

$now = Carbon::now();
 
// 格式 Y-M-d
$firstDay = $now->startOfMonth()->subMonth()->toDateString();
$lastDay = $now->endOfMonth()->toDateString();
 
dd([$firstDay,$lastDay]);
 
//自定义格式
$firstDay = $now->startOfMonth()->subMonth()->format('Y-m');

参考: Laravel 获取上月的第一天和最后一天 - 「fly一样的感觉」

这里主要使用到 Carbon 库的工厂类方法。如果是指定年月而非当下,可以使用 Carbon::createFromDate() 来创建这样一个日期。

$date =  Carbon::createFromDate($year, $month);
$d = $date->endOfMonth()->format('j');

Carbon 还有好多其他好用的工厂类方法,可以自行查询。