date_days_in_month() 是 php 8 中获取当月天数最直接可靠的方法,传入年份、数字月份(1–12)及可选时区即可返回天数,月份非数字或越界则返回 false。

date_days_in_month() 函数直接返回天数
PHP 8 里最直接的方式就是用 date_days_in_month(),它专为这事设计,不用自己算闰年或查月份长度。传入年份、月份(1–12)、可选时区,它就返回当月天数。
注意:月份必须是数字(1 表示一月),不能是字符串 "01" 或 "Jan",否则返回 false。
-
date_days_in_month(2024, 2)→29(闰年二月) -
date_days_in_month(2023, 2)→28 -
date_days_in_month(2023, 13)→false(月份越界) - 时区影响小,但若传了无效时区名(如
"Asia/Shangha"),函数会静默失败并返回false
用 cal_days_in_month() 要指定日历类型
这个函数在 PHP 8 仍可用,但比 date_days_in_month() 多一个参数:日历类型。日常用公历,就得写 CAL_GREGORIAN,少写或写错就出问题。
它不依赖当前时区,也不校验年月范围(比如 cal_days_in_month(CAL_GREGORIAN, 2023, 0) 会返回 31),容易埋坑。
-
cal_days_in_month(CAL_GREGORIAN, 2023, 4)→30 -
cal_days_in_month(CAL_JULIAN, 2023, 4)→ 结果不同(极少用) - 别省略第一个参数,
cal_days_in_month(2023, 4)会报 Warning 并返回false
用 DateTime 推到下个月再减一天
这是兼容性最强的写法,适合需要同时支持 PHP 7.x 的项目,但没必要在纯 PHP 8 环境里绕这么远。核心逻辑是:构造当月第一天 → 加一个月 → 减一天 → 取日。
要注意 DateTime 对月底日期的自动归正行为——比如 2023-01-31 +1 month 会变成 2023-02-28(不是 2023-03-03),这反而是我们想要的。
-
(new DateTime('2023-02-01'))->modify('+1 month')->modify('-1 day')->format('j')→28 - 别用
'last day of'直接修饰,new DateTime('2023-02-01')->modify('last day of February 2023')写死月份反而难复用 - 字符串日期格式必须含年月,
'2-2023'这类可能被误解析成2023-02-01或报错
别用 date() + mktime() 拼时间戳
老教程里常见用 mktime(0,0,0,$month+1,0,$year) 取上月最后一天,但在 PHP 8 中,mktime() 对非法日期(如 month=13)会返回 false,且时区处理模糊,date('t', $ts) 的 t 格式符虽简洁,但底层仍依赖时间戳是否有效。
-
date('t', mktime(0,0,0,13,1,2023))→false(PHP 8.1+ 报 Deprecated,8.2+ 可能彻底失效) -
date('t', strtotime('2023-02-01'))→ 始终返回28,和输入日期无关,容易误以为它“智能”,其实只是固定取当月天数,不可靠 - 所有基于时间戳的方案都受
strtotime()解析歧义影响,比如'2/30/2023'会被强行归正,结果不可控
真正要稳又干净,就用 date_days_in_month();如果逻辑里已经重度依赖 DateTime 对象,顺手用 modify() 链式调用也行。别为了“看起来高级”去拼时间戳,尤其在 PHP 8 的严格模式下,这类写法更容易突然崩。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











