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

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

相关推荐
SL_staff6 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
SL_staff7 小时前
企业AI落地难?JVS-AI渐进式实践:安全可控、小切口验证、标准化沉淀与规模化复制
java·开源·aigc
David猪大卫7 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
SL_staff8 小时前
JVS数字底座实践:构建企业级统一内容管理平台的技术路径
java·产品
nice_lcj5208 小时前
【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端
java·后端·spring·spring ai·ai应用开发
fengci.8 小时前
CTF2MISC中等部分
开发语言·前端·学习
桦说编程9 小时前
TransmittableThreadLocal 解读:从 CRR 机制到上下文所有权
java·后端·源码
xys_67810 小时前
JavaEE通关手册:初识Java
java·开发语言
文丑颜不良啊10 小时前
LeetCode2461~2480题目解析
java·leetcode
雾时之林11 小时前
国内Docker 镜像加速器配置
云原生·eureka