PHP里取月份最后一天的几种方式
做报表、账单结算、合同到期计算这些场景经常需要知道某个月的最后一天是几号。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直接拿天数效率上略好一些适合只需要知道天数、不需要完整日期对象的场合。实际用的时候挑一个顺手、跟项目现有代码风格一致的就行不需要纠结哪个“更好”。