checkdate仅验证年-月-日三个整数是否构成合法格里高利历日期,参数必须为1–32767年内1–12月对应有效日数的int型值,不处理字符串、时区或格式解析。

直接说结论: checkdate 只能验证「年-月-日」三个整数是否构成一个合法的格里高利历日期,不接受字符串、时间戳或带时分秒的数据;它不校验格式、不解析文本、不处理时区,用错场景会白忙活。
checkdate参数必须是int,且范围严格
很多人传入字符串如 "2" 或 "2024",PHP 会静默转成 int,但一旦遇到空值、null、非数字字符串(比如 "2月"),就会触发警告并返回 false —— 这不是校验失败,是参数根本没过第一关。
-
$month必须是 1–12 的整数,传 0、13、"02"都不行 -
$day不是“1–31”,而是“该月实际存在的日数”,比如 2024 年 2 月最多 29 天,checkdate(2, 30, 2024)返回false -
$year有效范围是 1–32767;传 0、负数(如-2000)、超大数(如50000)全判无效
别拿checkdate去验证表单字符串日期
用户提交的 "2024-02-30" 或 "30/02/2024" 是字符串,不能直接喂给 checkdate。常见错误写法:checkdate(...explode("-", $_POST['date'])) —— 如果用户输错格式(比如 "2024/02/30"),explode("-", ...) 会返回 ["2024/02/30"],导致参数数量不足,函数报 warning 并返回 false。
- 先用
DateTime::createFromFormat()解析字符串,再取format("n")、format("j")、format("Y")得到纯整数 - 或者用正则粗筛格式(如
/^\d{4}-\d{1,2}-\d{1,2}$/),再sscanf提取整数 - 直接传未过滤的
$_POST值进checkdate是典型漏洞点:绕过格式校验后可能触发类型转换异常
闰年、大小月、年份边界它都管,但不报具体错因
checkdate 内部已完整实现格里高利历规则:能识别 1900 不是闰年、2000 是闰年、4 月只有 30 天、11 月没有 31 日……但它只返回 true 或 false,不告诉你“为什么错”。调试时容易卡在“明明看着对,怎么还是 false”。
- 典型陷阱:
checkdate(2, 29, 2100)→false(2100 被格里高利历排除为闰年) - 年份超限:
checkdate(1, 1, 32768)→false,但checkdate(1, 1, 32767)→true - 如果需要提示用户“2月不能有30日”,得自己根据参数组合写判断逻辑,
checkdate不提供错误码或消息
真正难的不是调用 checkdate,而是确保传进去的三个整数本身来自可信、干净的上下文——它像一把精准的尺子,但不会帮你把歪掉的木料扶正。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











