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

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

相关推荐
CallmeFoureyes1 小时前
使用 C# 提取 Word 文档中的表格数据
开发语言·c#·word
gugucoding1 小时前
2. 【Java】搭建Java开发环境
java·开发语言
多加点辣也没关系1 小时前
JavaScript|第9章:对象 — 基础
开发语言·javascript·ecmascript
2601_949818091 小时前
Vector从入门到应用(C++ STL动态数组万字全解
开发语言·c++
wang09072 小时前
自己动手写一个spring之MVC_3
java·spring·mvc
闲猫2 小时前
Spring AI / Models / Chat Models / Ollama
java·人工智能·spring
汤米粥2 小时前
Python爬虫中Xpath用法之——normalize-space()
开发语言·python
FREEDOM_X2 小时前
Linux 多线程编程——总结
java·linux·运维·ubuntu
科技道人2 小时前
记录 设置-显示大小和字体
开发语言·android设置·字体和显示大小