PHP checkdate() 函数

checkdate() 函数用于验证日期的有效性,检查指定的年、月、日是否构成一个有效的格里高利日期。

提示: 该函数在处理表单提交的日期数据、验证用户输入或进行日期计算前非常有用。

语法

bool checkdate ( int $month , int $day , int $year )

参数说明

参数 描述 必需
$month 月份,范围 1-12
$day 日期,范围取决于月份和闰年
$year 年份,范围 1-32767

返回值

  • true - 如果日期有效
  • false - 如果日期无效

示例代码

示例 1:基本用法

<?php
// 检查日期是否有效
if (checkdate(2, 29, 2024)) {
    echo "2024年2月29日是有效日期(闰年)";
} else {
    echo "日期无效";
}
// 输出:2024年2月29日是有效日期(闰年)
?>

示例 2:验证用户输入

<?php
// 模拟表单提交的日期数据
$year = 2023;
$month = 13; // 无效月份
$day = 32;   // 无效日期

if (checkdate($month, $day, $year)) {
    echo "日期有效";
} else {
    echo "日期无效!请检查:月份{$month},日期{$day},年份{$year}";
}
// 输出:日期无效!请检查:月份13,日期32,年份2023
?>

示例 3:结合日期选择验证

<?php
// 验证日期并执行相关操作
$birthYear = 1990;
$birthMonth = 7;
$birthDay = 15;

if (checkdate($birthMonth, $birthDay, $birthYear)) {
    echo "出生日期有效:{$birthYear}-{$birthMonth}-{$birthDay}";

    // 计算年龄
    $today = new DateTime();
    $birthdate = new DateTime("{$birthYear}-{$birthMonth}-{$birthDay}");
    $age = $today->diff($birthdate)->y;
    echo ",年龄:{$age}岁";
} else {
    echo "出生日期无效";
}
// 输出:出生日期有效:1990-7-15,年龄:34岁(假设当前是2024年)
?>

示例 4:批量验证日期

<?php
// 需要验证的日期数组
$datesToCheck = [
    ['year' => 2023, 'month' => 2, 'day' => 28],
    ['year' => 2023, 'month' => 2, 'day' => 29], // 无效
    ['year' => 2024, 'month' => 2, 'day' => 29], // 有效(闰年)
    ['year' => 2023, 'month' => 4, 'day' => 31], // 无效(4月只有30天)
    ['year' => 2023, 'month' => 12, 'day' => 31],
];

foreach ($datesToCheck as $date) {
    $isValid = checkdate($date['month'], $date['day'], $date['year']);
    $status = $isValid ? '✓ 有效' : '✗ 无效';
    echo "{$date['year']}-{$date['month']}-{$date['day']}: {$status}<br>";
}
/*
输出:
2023-2-28: ✓ 有效
2023-2-29: ✗ 无效
2024-2-29: ✓ 有效
2023-4-31: ✗ 无效
2023-12-31: ✓ 有效
*/
?>

注意事项

重要提示:
  • 年份参数的范围是 1-32767,超出范围将返回 false
  • 月份参数必须是 1-12 之间的整数
  • 日期参数必须在该月份的有效天数范围内(考虑闰年)
  • 函数不考虑时区设置,仅验证日历日期
  • 对于历史日期验证,格里高利历从1582年开始,但此函数可验证更早的年份

与其他日期验证方法比较

<?php
// 方法1:使用checkdate()
$valid1 = checkdate(2, 29, 2024);

// 方法2:使用DateTime类
try {
    $date = new DateTime('2024-02-29');
    $valid2 = true;
} catch (Exception $e) {
    $valid2 = false;
}

// 方法3:使用strtotime()和date()
$timestamp = strtotime('2024-02-29');
$valid3 = ($timestamp !== false && date('Y-m-d', $timestamp) === '2024-02-29');

echo "checkdate: " . ($valid1 ? '有效' : '无效') . "<br>";
echo "DateTime: " . ($valid2 ? '有效' : '无效') . "<br>";
echo "strtotime: " . ($valid3 ? '有效' : '无效') . "<br>";
?>

常见问题

不能。checkdate()的年份参数必须是正整数(1-32767)。要验证公元前日期,可以使用DateTime类。
checkdate(0, 0, 0)会返回false,因为0不在有效范围内。所有参数都必须是正整数。