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直接拿天数,效率上略好一些,适合只需要知道天数、不需要完整日期对象的场合。

实际用的时候挑一个顺手、跟项目现有代码风格一致的就行,不需要纠结哪个"更好"。

相关推荐
就叫_这个吧1 小时前
Java递归方法实现面包屑导航
java·开发语言
fīɡЙtīиɡ ℡1 小时前
AI 应用系统设计
java·开发语言·人工智能
城管不管1 小时前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
码匠许师傅1 小时前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
AI绘画哇哒哒2 小时前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
最强小杰2 小时前
gpt-5.6-sol 频繁报 503 怎么办?区分容量熔断和限速 429 的排查方法 + 可复用 retry wrapper
java·人工智能·gpt·ai
今天AI了吗3 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
TELL5213 小时前
selenium webdriver 第二次初始化的异常
开发语言·python
动词ing4 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习4 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展