0

0

PHP如何获取闰年二月天数_PHP闰年二月天数判断方法【方法】

雪夜

雪夜

发布时间:2026-03-02 19:41:36

|

623人浏览过

|

来源于php中文网

原创

推荐使用 cal_days_in_month(cal_gregorian, 2, $year),它不依赖时间戳、规避闰年逻辑错误,兼容1–9999年;date('t') 和 datetime 因时间戳限制及废弃风险不推荐。

php如何获取闰年二月天数_php闰年二月天数判断方法【方法】

PHP怎么用 date()cal_days_in_month() 获取二月天数

直接看结果:闰年二月是29天,平年28天。PHP不靠手算年份,而是用内置函数查日历表——cal_days_in_month() 最稳,date('t', ...) 也能用,但得注意时间戳精度。

常见错误是硬写逻辑判断闰年(比如 $year % 4 == 0),漏掉“整百年必须被400整除”这条规则,导致2100年、1900年这类年份算错。

  • cal_days_in_month(CAL_GREGORIAN, 2, $year):最推荐,底层调用系统日历库,完全规避闰年逻辑出错风险
  • date('t', mktime(0, 0, 0, 2, 1, $year)):可行,但依赖 mktime() 对无效日期(如2月30日)的自动修正,PHP 8.1+ 已标记 mktime() 为废弃,未来可能移除
  • 别用 strtotime("2024-02-01") 再格式化,strtotime() 在时区或 DST 边界下可能返回 false,导致 date('t') 算出31天这种荒谬结果

为什么 DateTime::createFromFormat() 不适合查二月天数

它本意是解析字符串,不是计算月份长度。强行用 new DateTime("2024-02-01")->format('t') 看似能跑通,但本质和 date('t') 一样,绕不开时间戳构造环节;更麻烦的是,如果传入的年份超出 PHP 时间戳范围(Unix timestamp 溢出,比如年份 2038 在32位系统),会静默返回1月天数(31),而不是报错。

典型翻车场景:处理历史数据(如1752年英国历法改革年)或远期规划(2150年养老金计算),DateTime 实例化失败却无提示,format('t') 还照常返回31。

立即学习PHP免费学习笔记(深入)”;

遨虾
遨虾

1688推出的跨境电商AI智能体

下载
  • 只在确定年份落在 1901–2038(32位)或 1970–2038(部分旧配置)范围内才考虑 DateTime
  • 跨世纪年份一律退回 cal_days_in_month(),它不依赖时间戳,纯查格里高利历表
  • 注意 CAL_GREGORIAN 是常量,不是字符串,写成 'CAL_GREGORIAN' 会报 Warning: cal_days_in_month(): invalid calendar

cal_days_in_month() 的兼容性坑点

这个函数从 PHP 4.0 就存在,看似很稳,但有两个隐藏限制:一是 Windows 下某些旧版 PHP(

真正容易被忽略的是参数顺序:cal_days_in_month($calendar, $month, $year),不是 ($year, $month)。把年份放第二位会导致返回 false,而 PHP 默认不报错,后续 if 判断直接走错分支。

  • 务必检查返回值是否为 false,尤其当 $year 来自用户输入或数据库字段时(比如空字符串、负数、超大整数)
  • Windows + PHP 5.2 环境下,传入 $year = 0 可能返回 28 而不是预期的错误,Linux 下则返回 false,跨平台代码必须做类型校验
  • 不用试图用它查农历二月——CAL_JEWISHCAL_CHINESE 不支持月份天数查询,会直接返回 false

简单封装一个安全的闰年二月天数函数

把校验和兜底写进函数里,比每次调用都手动 check 更可靠。重点不是多 fancy,而是堵住 null、字符串、负数这些常见脏数据入口。

function getFebDays(int $year): int
{
    if ($year < 1 || $year > 9999) {
        throw new InvalidArgumentException('Year must be between 1 and 9999');
    }
    $days = cal_days_in_month(CAL_GREGORIAN, 2, $year);
    return $days ?: 28; // fallback only for extreme edge cases (e.g. broken extension)
}

这个函数没加闰年逻辑重实现,就是信任 cal_days_in_month()。如果你发现它返回了28但你知道那年是闰年,问题一定出在 PHP 编译时没启用 calendar 扩展(检查 php -m | grep calendar),而不是代码逻辑错了。

闰年规则本身不难,难的是让代码在各种 PHP 版本、系统、输入质量下都不掉链子。最省心的做法,就是把计算交给 C 层日历库,而不是在 PHP 层重复造轮子。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

249

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

967

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1560

2023.10.24

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

839

2023.08.22

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

866

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

454

2024.06.27

java中calendar类的用法
java中calendar类的用法

Java Video类是JavaFX库中的一个类,用于创建和操作视频对象。它提供了方法来加载、播放、暂停、停止和控制视频的音量、速度和循环等属性。想了解更多Java中类的相关内容,可以阅读本专题下面的文章。

324

2024.02.29

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

658

2023.08.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

48

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.8万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号