做报表、账单结算、合同到期计算,这些场景经常需要知道某个月的最后一天是几号。PHP里能实现的方式不止一种,下面逐个说。
用date函数的t参数,这应该是用得最多的写法。t这个格式字符专门用来返回给定月份有多少天,配合strtotime先构造出那个月的第一天,让date去算就行:
function getLastDayMethod1($year, $month) {
return date('Y-m-t', strtotime("$year-$month-01"));
}
$year = 2025;
$month = 2;
echo "方法1结果: " . getLastDayMethod1($year, $month) . "\n";
如果只是取当前月份最后一天,更简单,直接date('Y-m-t')不带第二个参数就行,它默认用当前时间戳。所以很多时候一行代码就解决了。
不过这种方式依赖strtotime做字符串解析,日期格式得写对。一般"年-月-01"这种形式没问题,但如果传入的字符串不规范,strtotime返回false的情况也不是没有,线上跑起来问题就出来了。
如果项目里已经在用DateTime类处理日期逻辑,那第二种方式更顺手:

function getLastDayMethod2($year, $month) {
$date = new DateTime("$year-$month-01");
$date->modify('last day of this month');
return $date->format('Y-m-d');
}
$year = 2025;
$month = 2;
echo "方法2结果: " . getLastDayMethod2($year, $month) . "\n";
modify方法接受的是一个相对格式的字符串,'last day of this month'语义很直白,不用去记t这个格式字符。另外DateTime支持时区设置,如果业务涉及跨时区,比如服务器在UTC但用户在东八区,初始化的时候传个DateTimeZone进去就行,date函数处理时区相对麻烦一些。
第三种方式用cal_days_in_month,这个函数知道的人可能没前两种多:
SSL证书申请支持自动验证、自动部署功能!lcjmSSL提供完整的自动化能力。无论个人开发者还是初创团队,都能享受企业级的证书管理体验。
function getLastDayMethod3($year, $month) {
$days = cal_days_in_month(CAL_GREGORIAN, $month, $year);
return "$year-$month-$days";
}
$year = 2025;
$month = 2;
echo "方法3结果: " . getLastDayMethod3($year, $month) . "\n";
它直接返回指定月份的天数,第一个参数传CAL_GREGORIAN,也就是公历。返回的是个整数,拿到天数之后拼出完整日期就行。
这里有个小细节:拼接的时候月份和天数不会自动补零,所以如果month是2、days是28,出来的字符串是"2025-2-28"而不是"2025-02-28"。
要不要补零看业务需要,多数情况下直接用也没问题,但如果下游系统对日期格式要求严格,可能得自己sprintf处理一下------当然这属于格式化的范畴了,方法本身是没问题的。
三种方式用2025年2月做测试,返回的都是2025-02-28,闰年处理也都正确。date加strtotime的组合胜在简洁,一两行搞定;DateTime的方式更面向对象,有时区需求的时候优势明显;cal_days_in_month直接拿天数,效率上略好一些,适合只需要知道天数、不需要完整日期对象的场合。
实际用的时候挑一个顺手、跟项目现有代码风格一致的就行,不需要纠结哪个"更好"。