checkdate() 是 PHP 验证公历日期有效性的内置函数,接收月、日、年三个整数参数,仅校验逻辑合法性,不处理字符串解析、时区或格式。

checkdate() 是 PHP 内置函数,用于验证一个格里高利历(公历)日期是否有效。在 PHP 8.1 中它的行为与之前版本一致,没有新增参数或改动,但需注意它只校验日期逻辑合法性,不处理格式解析或时区。
checkdate() 的基本用法
函数签名:
bool checkdate(int $month, int $day, int $year)
它接收三个整数参数:月份(1–12)、日期(1–31)、年份(支持负数,但通常建议 1–9999)。返回 true 表示该日期存在(如 2023 年 2 月 29 日 → false;2024 年 2 月 29 日 → true),否则返回 false。
验证前需先提取数字,不能直接传字符串
checkdate() 不接受字符串,也不自动转换。如果从表单或 JSON 获取的是 "2023-02-30" 这类字符串,必须先拆解为整数:
立即学习“PHP免费学习笔记(深入)”;
- 用 explode("-", $dateStr) 或 date_parse($dateStr) 提取年月日
- 确保每个部分是整数(可用 (int) 强转,但注意 "00" 会变 0,而月份/日期不能为 0)
- 推荐用 DateTime::createFromFormat() 配合 getLastErrors() 做更健壮的格式+逻辑双重校验
常见易错点提醒
- 月份必须是 1–12,传入 0、13 或负数直接返回 false
- 日期超出当月天数即无效(如 4 月 31 日、平年 2 月 29 日)
- 年份支持负数(如 -100 表示公元前 101 年),但 checkdate() 按公历回溯计算,历史准确性不保证
- 它不校验时间部分(时分秒)、不检查是否为未来日期、也不处理闰秒或历法变更(如 1582 年 10 月缺失 10 天)
简单示例:安全验证用户输入的 YYYY-MM-DD
```php
function isValidDate(string $dateStr): bool {
$parts = explode('-', $dateStr);
if (count($parts) !== 3) return false;
[$y, $m, $d] = array_map('intval', $parts);
return checkdate($m, $d, $y);
}
var_dump(isValidDate("2024-02-29")); // true
var_dump(isValidDate("2023-02-29")); // false
```



















